您的位置:首页 > 其它

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

.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; }

[p] 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: