AC自动机模板
2016-07-30 09:36
344 查看
///AC自动机模板 void insert(char *s) { int p=0; for (int i=0;s[i];i++) { int k=s[i]-'a'; if (tree[p].next[k]==-1) { tree[cut].init(k); tree[p].next[k]=cut++; } p=tree[p].next[k]; } tree[p].count++; } void ac() { int k=0; queue<Node>q; q.push(tree[0]); while (!q.empty()) { Node u=q.front(); q.pop(); for (int i=0;i<26;i++) { if (u.next[i]!=-1) { if (u.data==-1) tree[u.next[i]].fail=0; else { int v=u.fail; while (v&&tree[v].next[i]==-1) v=tree[v].fail; tree[u.next[i]].fail=max(tree[v].next[i],0); } q.push(tree[u.next[i]]); } } } } int getans(char *s) { int k=0,ans=0; for (int i=0;s[i];i++) { int x=s[i]-'a'; while (k&&tree[k].next[x]==-1) k=tree[k].fail; k=tree[k].next[x]; if (k==-1) {k=0;continue;} int j=k; while (tree[j].count) { ans+=tree[j].count; tree[j].count=0; j=tree[j].fail; } ans+=tree[tree[j].fail].count; tree[tree[j].fail].count=0; } return ans; }