const int maxn=10000010,M=26;
struct node
{
int num;
node *nt[M],*fail;
void init()
{
num=0;
for(int i=0;i<M;i++) nt[i]=NULL;
fail=NULL;
}
}T[maxn];
#define root T
int cnt;
void insert(char *s)
{
node *p=root;
for(int i=0;s[i];i++)
{
int t=s[i]-'a';
if(!p->nt[t])
{
T[cnt].init();
p->nt[t]=&T[cnt++];
}
p=p->nt[t];
}
p->num++;
}
void buildfail()
{
queue<node*> q;
node* p=root;
q.push(p);
while(!q.empty())
{
node* f=q.front(); q.pop();
for(int i=0;i<26;i++)
{
if(f->nt[i])
{
node *tmp=f->fail;
while(tmp&&!tmp->nt[i]) tmp=tmp->fail;
if(!tmp) f->nt[i]->fail=root;
else f->nt[i]->fail=tmp->nt[i];
q.push(f->nt[i]);
}
}
}
}
int search(char *s)
{
int ans=0;
node *p=root;
while(*s)
{
int t=*s-'a';
while(!p->nt[t]&&p!=root) p=p->fail;
p=p->nt[t]; if(!p) p=root;
node* tp=p;
while(tp!=root && tp->num!=-1)
{
ans+=tp->num;
tp->num=-1;
tp=tp->fail;
}
s++;
}
return ans;
}
AC自动机
最新推荐文章于 2024-12-03 15:15:25 发布