您的位置:首页 > 编程语言

ac自动机代码模板

2018-02-20 16:02 218 查看
简介

给出待查找字符串s1,s2,s3…sn

给出目标文本S

在S中查找有多少个s1,s2….sn

maxn是文本的长度

maxt是建立trie图状态个数

#include<bits/stdc++.h>
using namespace std;
const int maxn=1000006;
const int maxt=500005;

struct Aho
{
struct StateTable
{
int next[26];
int cnt,fail;
}stateTable[maxt];

queue<int> que;
int Size;

void init()
{
while(!que.empty())
que.pop();

for(int i=0;i<maxt;i++)
{
memset(stateTable[i].next,0,sizeof(stateTable[i].next));
stateTable[i].cnt=stateTable[i].fail=0;
}

Size=1;
}

void Insert(char *S)//插入待查找串s1,s2...sn
{
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;
que.push(0);

while(!que.empty())
{
int u=que.front();
que.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;
}
que.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 now=0,res=0;
int n=strlen(S);

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+=Get(now);
}
}
return res;
}

}aho;

int T,N;
char s[maxn];

int main()
{
ios::sync_with_stdio(false);
cin>>T;
while(T--)
{
cin>>N;
aho.init();
for(int i=0;i<N;i++)
{
cin>>s;
aho.Insert(s);
}
aho.build();
cin>>s;
cout<<aho.match(s)<<endl;
}
return 0;
}


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