AC自动机个人较浅的理解就是kmp的扩展,trie+kmp处理多个字符串匹配。
下面的是我的模板:
注:此模板根据notonlysuccess大牛的模板更改而来,代码更短,但速度有些下降,因为在init()内做了大量的的memset()
#define FOR(i,n) for(int i=0; i<n; i++)
#define CC(A,x) memset(A,x,sizeof(A))
const int NN=5001, CH=26;
struct Trie{
inline int sw(char *c){return *c-'a';}
void init(){CC(chd,0); CC(F,0); CC(W,0); sz=1;}
void insert(char *s, int val){
int p = 0;
for (int v; *s; p=chd[p][sw(s++)])
if (!chd[p][v=sw(s)]) chd[p][v]=sz++;
W[p] = val;
}
void AC(){
int Q[NN], *b=Q, *e=Q, v;
FOR(i,CH) if(v=chd[0][i]) *e++ = v;
for (int p=*b; b!=e; p=*++b)
FOR(i,CH) if(v=chd[p][i]){
F[*e++ = v] = chd[F[p]][i];
}else chd[p][i] = chd[F[p]][i];
}
int chd[NN][CH], F[NN], W[NN], sz;
};