HDU2222 AC自动机模板
2018-01-22 09:12
417 查看
直接统计答案,要是统计相同个数呢?不清零即可。
#include<bits/stdc++.h> using namespace std; struct node { int v[26],f,s; }t[500005]; int T,n,cnt,rt; queue<int>q; char s[1000005]; void build() { int l=strlen(s);int now=0; for(int i=0;i<l;++i) { if(t[now].v[s[i]-'a']){ now=t[now].v[s[i]-'a']; } else{ now=t[now].v[s[i]-'a']=++cnt; } } t[now].s++; } void init() { for(int i=0;i<=cnt;++i) { for(int j=0;j<26;++j)t[i].v[j]=0; t[i].f=t[i].s=0; } cnt=0; } void getfail() { for(int i=0;i<26;++i) { if(t[rt].v[i])q.push(t[rt].v[i]),t[t[rt].v[i]].f=0; } while(!q.empty()) { int x=q.front();q.pop(); for(int i=0;i<26;++i) { if(t[x].v[i]){ q.push(t[x].v[i]); t[t[x].v[i]].f=t[t[x].f].v[i]; } else{ t[x].v[i]=t[t[x].f].v[i]; } } } } void work() { int ans=0;int l=strlen(s);int now=0; for(int i=0;i<l;++i) { now=t[now].v[s[i]-'a']; int p=now; while(p) { if(t[p].s<0)break; ans+=t[p].s; t[p].s=-1; p=t[p].f; } } printf("%d\n",ans); return; } int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); init(); for(int i=1;i<=n;++i) { scanf("%s",s); build(); } scanf("%s",s); getfail(); work(); } return 0; }
相关文章推荐
- hdu 2222 ac自动机模板
- hdu 2222 Keywords Search(AC自动机模板)
- HDU 2222 AC自动机 模板
- hdu 2222 Keywords_ac自动机模板
- 【HDU-2222】Keywords Search(AC自动机模板)
- HDU 2222 - Keywords Search(AC自动机模板)
- HDU 2222 ACAM模板(AC自动机)
- hdu 2222 Keywords_ac自动机模板
- hdu 2222 AC自动机模板题
- hdu 2222 ac自动机模板题
- HDU 2222 AC自动机模板
- hdu 2222(AC自动机模板)
- HDU 2222 Keywords Search(AC自动机模板)
- HDU 2222 AC自动机模板
- AC自动机(Aho-Corasick automation)模板 HDU:2222
- Match:Keywords Search(AC自动机模板)(HDU 2222)
- hdu 2222 ac自动机模板题
- hdu 2222 ac自动机入门题 可以做模板
- hdu 2222 AC自动机模板题(指针版+数组版)
- HDU 2222 Keywords Search 【AC自动机(模板题)】