HDU2222 AC自动机模板
直接统计答案,要是统计相同个数呢?不清零即可。
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct node 4 { 5 int v[26],f,s; 6 }t[500005]; 7 int T,n,cnt,rt; 8 queue<int>q; 9 char s[1000005]; 10 void build() 11 { 12 int l=strlen(s);int now=0; 13 for(int i=0;i<l;++i) 14 { 15 if(t[now].v[s[i]-'a']){ 16 now=t[now].v[s[i]-'a']; 17 } 18 else{ 19 now=t[now].v[s[i]-'a']=++cnt; 20 } 21 } 22 t[now].s++; 23 } 24 void init() 25 { 26 for(int i=0;i<=cnt;++i) 27 { 28 for(int j=0;j<26;++j)t[i].v[j]=0; 29 t[i].f=t[i].s=0; 30 } 31 cnt=0; 32 } 33 void getfail() 34 { 35 for(int i=0;i<26;++i) 36 { 37 if(t[rt].v[i])q.push(t[rt].v[i]),t[t[rt].v[i]].f=0; 38 } 39 while(!q.empty()) 40 { 41 int x=q.front();q.pop(); 42 for(int i=0;i<26;++i) 43 { 44 if(t[x].v[i]){ 45 q.push(t[x].v[i]); 46 t[t[x].v[i]].f=t[t[x].f].v[i]; 47 } 48 else{ 49 t[x].v[i]=t[t[x].f].v[i]; 50 } 51 } 52 } 53 } 54 void work() 55 { 56 int ans=0;int l=strlen(s);int now=0; 57 for(int i=0;i<l;++i) 58 { 59 now=t[now].v[s[i]-'a']; 60 int p=now; 61 while(p) 62 { 63 if(t[p].s<0)break; 64 ans+=t[p].s; 65 t[p].s=-1; 66 p=t[p].f; 67 } 68 } 69 printf("%d\n",ans); 70 return; 71 } 72 int main() 73 { 74 scanf("%d",&T); 75 while(T--) 76 { 77 scanf("%d",&n); 78 init(); 79 for(int i=1;i<=n;++i) 80 { 81 scanf("%s",s); 82 build(); 83 } 84 scanf("%s",s); 85 getfail(); 86 work(); 87 } 88 return 0; 89 }
生命中真正重要的不是你遭遇了什么,而是你记住了哪些事,又是如何铭记的。