AC自动机
luckydrawbox · · 个人记录
变量
函数
代码
struct AC{
int tr[N][26],tot;
int e[N],fail[N];
queue<int>q;
void insert(string s){
int p=0;
for(int i=0;i<s.size();i++){
if(!tr[p][s[i]-'a'])
tr[p][s[i]-'a']=++tot;
p=tr[p][s[i]-'a'];
}
e[p]++;
}
void build(){
for(int i=0;i<26;i++)
if(tr[0][i])
q.push(tr[0][i]);
while(q.size()){
int p=q.front();
q.pop();
for(int i=0;i<26;i++){
if(tr[p][i]){
fail[tr[p][i]]=tr[fail[p]][i];
q.push(tr[p][i]);
}
else
tr[p][i]=tr[fail[p]][i];
}
}
}
int query(string t){
int p=0,ans=0;
for(int i=0;i<t.size();i++){
p=tr[p][t[i]-'a'];
for(int j=p;j&&e[j]!=-1;j=fail[j]){
ans+=e[j];
e[j]=-1;
}
}
return ans;
}
}ac;