您的位置:首页 > 其它

hdu 2222 ac自动机 模板

2016-09-21 19:17 344 查看
记录下网上学来的代码

#include <bits/stdc++.h>
#define maxn 1000008
#define tot 500005
using namespace std;
struct Aho{
struct state{
int next[26];
int fail,cnt;
}stateTable[tot];
queue<int>q;
int size;
void init(){
while(q.size())q.pop();
for(int i=0;i<tot;++i){
memset(stateTable[i].next,0,sizeof(stateTable[i].next));
stateTable[i].fail=stateTable[i].cnt=0;
}
size=1;
}
void insert(char *s){
int n=strlen(s);
int now=0;
for(int i=0;i<n;++i){
char c=s[i];
if(!stateTable[now].next[c-'a'])
stateTable[now].next[c-'a']=size++;
now=stateTable[now].next[c-'a'];
}
stateTable[now].cnt++;
}
void build(){
stateTable[0].fail=-1;
q.push(0);
while(q.size()){
int u=q.front();
q.pop();
for(int i=0;i<26;++i)
if(stateTable[u].next[i]){
if(u==0)stateTable[stateTable[u].next[i]].fail=0;
else {
int v=stateTable[u].fail;
while(v!=-1){
if(stateTable[v].next[i]){
stateTable[stateTable[u].next[i]].fail=stateTable[v].next[i];
break;
}
v=stateTable[v].fail;
}
if(v==-1)stateTable[stateTable[u].next[i]].fail=0;
}
q.push(stateTable[u].next[i]);
}
}
}
int Get(int u){
int res=0;
while(u){
res+=stateTable[u].cnt;
stateTable[u].cnt=0;
u=stateTable[u].fail;
}
return res;
}
int match(char *s){
int n=strlen(s);
int res=0,now=0;
for(int i=0;i<n;++i){
char c=s[i];
if(stateTable[now].next[c-'a'])
now=stateTable[now].next[c-'a'];
else {
int p=stateTable[now].fail;
while(p!=-1&&stateTable[p].next[c-'a']==0)p=stateTable[p].fail;
if(p==-1)now=0;
else now=stateTable[p].next[c-'a'];
}
if(stateTable[now].cnt)
res=res+Get(now);
}
return res;
}
}aho;
char s[maxn];
int main(){
int loop,n;
scanf("%d",&loop);
while(loop--){
scanf("%d",&n);
aho.init();
for(int i=1;i<=n;++i){
scanf("%s",s);
aho.insert(s);
}
aho.build();
scanf("%s",s);
printf("%d\n",aho.match(s));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: