const int maxlen=110,kind=26;
struct Trie
{
int nt[maxlen][kind],fail[maxlen],end[maxlen];
int root,L;
int newnode()
{
for(int i=0;i<kind;i++) nt[L][i]=-1;
end[L++]=0;
return L-1;
}
void init()
{
L=0;
root = newnode();
}
void insert(char *buf,int id)
{
int len=strlen(buf);
int now=root;
for(int i=0;i<len;i++)
{
if(nt[now][buf[i]-'a']==-1)
nt[now][buf[i]-'a']=newnode();
now=nt[now][buf[i]-'a'];
}
end[now]|=(1<<id);
}
void build()
{
queue<int>q;
fail[root]=root;
for(int i=0;i<kind;i++)
if(nt[root][i]==-1) nt[root][i]=root;
else
{
fail[nt[root][i]]=root;
q.push(nt[root][i]);
}
while(!q.empty())
{
int now=q.front(); q.pop();
end[now]|=end[fail[now]];
for(int i=0;i<kind;i++)
if(nt[now][i]==-1)
nt[now][i]=nt[fail[now]][i];
else
{
fail[nt[now][i]]=nt[fail[now]][i];
q.push(nt[now][i]);
}
}
}
};
AC自动机数组写法
最新推荐文章于 2022-05-26 18:59:00 发布