AC自动机,就是能自动AC,甚至是自动AK的机器(>人<;)
想啥呢!AK个锤子,能写成AC就不错了!
AC自动机的前缀知识就是,字典树+KMP。
AC自动机:
用每一个字串建立字典树
void insert(char str[])//树的构建
{
int p=0;
for(int i=0;str[i];i++)
{
int u=str[i]-'a';
if(!son[p][u])son[p][u]=++idx;
p=son[p][u];
}
cnt[p]++;
}
建立树上字母的next数组,用bfs,思维和建next一致
void bulid()//AC自动机建立
{
int hh=0,tt=-1;
for(int i=0;i<26;i++)
{
if(tr[0][i])
q[++tt]=tr[0][i];
}
while (hh<=tt)
{
int t=q[hh++];
for(int i=0;i<26;i++)
{
int p=tr[t][i];
if(!p)tr[t][i]=tr[ne[t]][i];
else
{
ne[p]=tr[ne[t]][i];
q[++tt]=p;
}
}
}
}
遍历母串每一个字母在树上的next;思路和kmp对应
然后就没了……