AC自动机入门题,只是上来传个模板。。。
1 //#include<bits/stdc++.h> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<iostream> 6 #include<queue> 7 #define inc(i,l,r) for(int i=l;i<=r;i++) 8 #define dec(i,l,r) for(int i=l;i>=r;i--) 9 #define link(x) for(edge *j=h[x];j;j=j->next) 10 #define mem(a) memset(a,0,sizeof(a)) 11 #define inf 1e9 12 #define ll long long 13 #define succ(x) (1<<x) 14 #define lowbit(x) (x&(-x)) 15 #define NM 10005 16 using namespace std; 17 int read(){ 18 int x=0,f=1;char ch=getchar(); 19 while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} 20 while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); 21 return x*f; 22 } 23 struct node{ 24 node *c[26],*fail; 25 int f; 26 }N[50*NM],*o,*root; 27 node* newnode(){ 28 o->fail=root;o->f=false;return o++; 29 } 30 int n,ans,m,T; 31 char st[1000000+5]; 32 void ins(){ 33 scanf("%s",st);m=strlen(st)-1; 34 node *r=root; 35 inc(i,0,m){ 36 int v=st[i]-'a'; 37 if(!r->c[v])r->c[v]=newnode(); 38 r=r->c[v]; 39 } 40 r->f++; 41 } 42 void bfs(){ 43 queue<node*>q; 44 inc(i,0,25)if(root->c[i])q.push(root->c[i]); 45 while(!q.empty()){ 46 node *t=q.front();q.pop(); 47 inc(j,0,25)if(t->c[j]){ 48 node *r=t->fail; 49 while(r!=root&&!r->c[j])r=r->fail; 50 t->c[j]->fail=r->c[j]?r->c[j]:root; 51 // if(t->c[j]->fail->f)t->c[j]->f+=r->c[j]->fail->f; 52 q.push(t->c[j]); 53 } 54 } 55 } 56 void find(){ 57 scanf("%s",st);m=strlen(st)-1; 58 node *r=root; 59 inc(i,0,m){ 60 int v=st[i]-'a'; 61 while(r!=root&&!r->c[v])r=r->fail; 62 if(r->c[v]){ 63 r=r->c[v]; 64 for(node *t=r;t!=root;t=t->fail) 65 ans+=t->f,t->f=0; 66 } 67 } 68 } 69 int main(){ 70 // freopen("data.in","r",stdin); 71 T=read(); 72 while(T--){ 73 mem(N);o=N;root=newnode();root->fail=root;ans=0; 74 n=read(); 75 inc(i,1,n)ins(); 76 bfs(); 77 find(); 78 printf("%d\n",ans); 79 } 80 return 0; 81 }