标签:blog ar for on div log amp as tt
AC自动机
struct ACauto
{
int ch[MAXN][26];
int size;
int f[MAXN],last[MAXN],val[MAXN],cnt[MAXN];
void init()//初始化
{
size=1;
memset(ch[0],0,sizeof(ch[0]));
memset(cnt,0,sizeof(cnt)); //用于统计配对数
}
int idx(char c)//用于返回编号
{
return c-‘a‘;
}
void insert(char *s,int v)//将字符串s插入字典树中,其中v是字符串的编号
{
int u=0,len=strlen(s);
for (int i=0;i<len;i++)
{
int c=idx(s[i]);
if (!ch[u][c])
{
memset(ch[size],0,sizeof(ch[size]));
val[size]=0;
ch[u][c]=size++;
}
u=ch[u][c];
}
val[u]=v;//在字符串末尾做出标记,标记为字符串的编号i
}
void print(int j)//用于输出处理
{
if (j)
{
cnt[val[j]]++;//成功配对数加1
print(last[j]);
}
}
int getFail()//构造失配函数
{
queue <int> q;
f[0]=0;
for (int c=0;c<26;c++)
{
int u=ch[0][c];
if (u)
{
f[u]=0;
q.push(u);
last[u]=0;
}
}
while (!q.empty())
{
int r=q.front(); q.pop();
for (int c=0;c<26;c++)
{
int u=ch[r][c];
if (!u)
{
ch[r][c]=ch[f[r]][c];
continue;
}
q.push(u);
int v=f[r];
f[u]=ch[v][c];
last[u]=val[f[u]]?f[u]:last[f[u]];
}
}
}
void find(char *T)//AC自动机主函数
{
int n=strlen(T);
int j=0;
for (int i=0;i<n;i++)
{
int c=idx(T[i]);
while(j&&!ch[j][c]) j=f[j];
j=ch[j][c];
if (val[j]) print(j);
else if (last[j]) print(last[j]);
}
}
}ac;
标签:blog ar for on div log amp as tt
原文地址:http://www.cnblogs.com/zhyfzy/p/4148186.html