您的位置:首页 > 其它

HDU 2222 AC自动机 模板

2017-07-28 20:29 483 查看
AC自动机模板题。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=1000005;
const int maxm=500005;
int T,n;
char s[maxn];
struct Aho {
struct state {
int next[26],cnt,fail;
} stateTable[maxm];
int size;
void init() {
memset(stateTable,0,sizeof stateTable);
size=0;
}
void insert(char *S) {
int n=strlen(S),now=0;
for (int i=0;i<n;++i) {
int id=S[i]-'a';
if (!stateTable[now].next[id])
stateTable[now].next[id]=++size;
now=stateTable[now].next[id];
}
++stateTable[now].cnt;
}
void build() {
queue<int> que;
stateTable[0].fail=-1;
for (int i=0;i<26;++i)
if (stateTable[0].next[i]) {
que.push(stateTable[0].next[i]);
stateTable[stateTable[0].next[i]].fail=0;
}
while (!que.empty()) {
int now=que.front();
que.pop();
for (int i=0;i<26;++i) {
int o=stateTable[now].next[i];
if (o) {
int v=stateTable[now].fail;
while (v!=-1) {
if (stateTable[v].next[i]) {
stateTable[o].fail=stateTable[v].next[i];
break;
}
v=stateTable[v].fail;
}
if (v==-1)
stateTable[o].fail=0;
que.push(o);
}
}
}
}
int get(int now) {
int ret=0;
while (now!=-1) {
ret+=stateTable[now].cnt;
stateTable[now].cnt=0;
now=stateTable[now].fail;
}
return ret;
}
int search(char *S) {
int n=strlen(S),now=0,ret=0;
for (int i=0;i<n;++i) {
int id=S[i]-'a';
if (stateTable[now].next[id])
now=stateTable[now].next[id];
else {
int v=stateTable[now].fail;
while (v!=-1) {
if (stateTable[v].next[id]) {
now=stateTable[v].next[id];
break;
}
v=stateTable[v].fail;
}
if (v==-1)
now=0;
}
if (stateTable[now].cnt)
ret+=get(now);
}
return ret;
}
} aho;
int main()
{
scanf("%d",&T);
while (T--) {
scanf("%d",&n);
aho.init();
while (n--) {
scanf("%s",s);
aho.insert(s);
}
aho.build();
scanf("%s",s);
printf("%d\n",aho.search(s));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: