#include<cstdio> #include<iostream> #include<cstring> #define re register using namespace std; typedef unsigned long long ull; const int N=200005,base=131; int T,la,lb; ull power[N],ha[N],hb[N]; char A[N],B[N],ed[3]; inline void ini() { for(int i=0;i<=la;i++) ha[i]=hb[i]=0; } inline void work() { scanf("%d%d",&la,&lb); scanf("%s",A+1); scanf("%s",ed); ini(); for(re int i=1;i<=lb;i++) B[i]=A[i]; B[++lb]=ed[0]; for(re int i=1;i<=lb;i++) hb[i]=hb[i-1]*base+B[i]; for(re int i=1;i<=la;i++) ha[i]=ha[i-1]*base+A[i]; //debug();while(1); int ans=0; for(re int i=1;i<=min(la,lb);i++) { if(i==1) { if(A[1]==B[lb])ans=1; continue; } if(ha[i]==hb[lb]-hb[lb-i]*power[i]) ans=max(ans,i); //cout<<geta(1,i)<<' '<<getb(lb-i+1,lb)<<endl; } printf("%d\n",ans); } int main() { scanf("%d",&T); power[0]=1; for(re int i=1;i<=N;i++) power[i]=power[i-1]*base; while(T--)work(); return 0; }
#include<cstdio> #include<iostream> #include<cstring> using namespace std; const int N=10010; int T,trie[N*10][11],now=1,n; char str[55]; bool end[N*10]; bool ins(char *s) { int len=strlen(s),p=1; for(int i=0;i<len;i++) { int x=s[i]-'0'; if(!trie[p][x])trie[p][x]=++now; p=trie[p][x]; if(end[p])return 1; } end[p]=1; for(int i=0;i<=9;i++)if(trie[p][i])return 1; return 0; } void work() { memset(trie,0,sizeof(trie)); memset(end,0,sizeof(end)); scanf("%d",&n); bool res=0; now=1; for(int i=1;i<=n;i++) { scanf("%s",str); bool t=ins(str); if(t==1&&res==0) { puts("NO");res=1; } } if(!res)puts("YES"); } int main() { scanf("%d",&T); while(T--)work(); return 0; }
#include<iostream> #include<cstdio> #include<queue> #include<cstring> #define maxn 10010 #define maxl 1000100 using namespace std; int n; char s[maxl]; struct ac_automation { int tot; struct node { node *son[26];//記錄兒子 int size;//兒子數 node *fail;//失配指針 node () { memset(this,0,sizeof(node)); } }; node *root; inline void init() { root=new node(); } inline void insert() { int l=strlen(s+1),i=1; node *now=root; while(i<=l) { if(!now->son[s[i]-'a'])now->son[s[i]-'a']=new node(); now=now->son[s[i]-'a']; i++; } now->size++; } inline void build() { queue <node*> q; for(int i=0;i<26;i++) { if(root->son[i]) { q.push(root->son[i]); root->son[i]->fail=root; } else root->son[i]=root; } while(!q.empty()) { node *x=q.front(); q.pop(); for(int i=0;i<26;i++) { if(x->son[i]) { x->son[i]->fail=x->fail->son[i]; q.push(x->son[i]); } else x->son[i]=x->fail->son[i]; } } } inline int query() { node *now=root; int i=1,l=strlen(s+1),ans=0; while(i<=l) { now=now->son[s[i]-'a']; for(node *j=now;j!=root&&j->size!=-1;j=j->fail) { ans+=j->size; j->size=-1; } i++; } return ans; } }ac; int main() { int t; scanf("%d",&t); while(t--) { ac.init();//千萬別忘了 scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",s+1); ac.insert(); } ac.build(); scanf("%s",s+1); printf("%d\n",ac.query()); } return 0; }