您的位置:首页 > 其它

HDU 2222 Keywords Search

2016-10-07 01:19 351 查看
题目地址

AC自动机模板

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int Nmax=1000005;
const int Totmax=500005;
struct Aho
{
struct State
{
int next[26];
int cnt,fail;
}state_table[Totmax];

int size;
queue<int> Q;
void init()
{
while(Q.size())
Q.pop();
for(int i=0;i<Totmax;i++)
{
for(int j=0;j<26;j++)
state_table[i].next[j]=-1;
state_table[i].fail=state_table[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(state_table[now].next[c-'a']==-1)
state_table[now].next[c-'a']=size++;
now=state_table[now].next[c-'a'];
}
state_table[now].cnt++;
}

void build()
{
Q.push(0);
state_table[0].fail=0;
while(Q.size())
{
int now=Q.front();
Q.pop();
for(int i=0;i<26;i++)
{
if(now==0)
{
if(state_table[now].next[i]==-1)
state_table[now].next[i]=0;
else
{
state_table[ state_table[now].next[i] ].fail=0;
Q.push(state_table[now].next[i]);
}
}
else
{
if(state_table[now].next[i]==-1)
{
state_table[now].next[i]=state_table[ state_table[now].fail ].next[i];
}
else
{
state_table[ state_table[now].next[i] ].fail=state_table[ state_table[now].fail ].next[i];
Q.push(state_table[now].next[i]);
}
}

}
}
}

int match(char *s)
{
int n=strlen(s);
int ans=0;
int now=0;
for(int i=0;i<n;i++)
{
char c=s[i];
now=state_table[now].next[c-'a'];
if(state_table[now].cnt)
{
int u=now;
while(u)
{
ans+=state_table[u].cnt;
state_table[u].cnt=0;
u=state_table[u].fail;
}
}
}
return ans;
}

}aho;
char s[Nmax];
int main()
{
int t;
//freopen("in.in","r",stdin);
scanf("%d",&t);
while(t--)
{
int n;
aho.init();
scanf("%d",&n);
while(n--)
{
scanf("%s",s);
aho.insert(s);
}
scanf("%s",s);
aho.build();
printf("%d\n", aho.match(s));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: