hdu 2222 ac自动机
2013-05-30 22:22
363 查看
一直米有去拍个ac自动机的版,找了个模板题,一发居然米拍过。
贴下自己版吧
贴下自己版吧
#include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <vector> using namespace std; namespace AC { const int dict = 26; const int root = 0; const int maxn = 3000000; struct node { int son[dict], fail, idx; } tree[maxn]; bool apr[10010]; bool vis[3000000]; int cnt[10010]; //处理重复出现字符串 int sz; int initNode(int idx) { memset(tree[idx].son,0,sizeof(tree[idx])); tree[idx].fail=tree[idx].idx=0; return idx; } void init(){ sz = initNode(0); memset(apr,0,sizeof(apr)); memset(cnt,0,sizeof(cnt)); } void ins(char *s,int idx) { int cur=root,t; while (*s) { t = *s -'a'; if (!tree[cur].son[t]) tree[cur].son[t] = initNode(++sz); cur = tree[cur].son[t]; s++; } if(tree[cur].idx!=0) cnt[tree[cur].idx]++; else tree[cur].idx = idx; } queue<int> q; void buildac() { while(!q.empty()) q.pop(); int i, cur, nxt, f; for ( i = 0 ; i < dict ; i++ ) if (tree[root].son[i]) q.push(tree[root].son[i]); while (!q.empty()) { cur = q.front(); q.pop(); f = tree[cur].fail; for ( i = 0 ; i < dict ; i++ ) if (tree[cur].son[i]) { nxt = tree[cur].son[i]; tree[nxt].fail = tree[f].son[i]; q.push(nxt); } else tree[cur].son[i] = tree[f].son[i]; } } int search(char *s){ int i,cur=0; for (i=0 ; i<=sz ; i++ ) vis[i]=0; for ( ; *s ; s++ ){ cur = tree[cur].son[*s-'a']; for ( i=cur ; i && !vis[i]; i=tree[i].fail ){ //vis用于优化 vis[i]=1; apr[tree[i].idx]=1; } } int ret = 0; for(int i = 1;i<=10010;++i){ if(apr[i]){ ret++; ret += cnt[i]; } } return ret; } }; char str[1000010]; int main() { int t,n; scanf("%d",&t); while(t--){ AC::init(); scanf("%d",&n); for(int i = 1; i<=n;++i){ scanf("%s",str); AC::ins(str,i); } AC::buildac(); scanf("%s",str); printf("%d\n",AC::search(str)); } return 0; }
相关文章推荐
- hdu 2222 ac自动机入门题 可以做模板
- hdu 2222 AC自动机模板(非指针)
- hdu 2222 AC自动机
- Hdu 2222 Keywords Search [AC自动机多模匹配]
- hdu 2222(AC自动机第一题)
- HDU 2222 Keywords Search(AC自动机模板)
- hdu 2222 AC自动机
- hdu 2222 AC自动机模板题
- hdu 2222 AC自动机 first
- HDU 2222 AC自动机
- HDU 2222 AC_Automation 第一道AC自动机
- HDU 2222 Keywords Search [AC自动机]
- 【模板练习——AC自动机】Keywords Search HDU - 2222
- HDU_2222 Keywords Search 【AC自动机模板题】【动态链表】
- AC自动机 模板 hdu 2222
- HDU 2222 Keywords Search(AC自动机 入门)
- hdu 2222 Keywords Search (AC自动机-初步-很理解!)
- 【AC自动机】HDU 2222 Keywords Search 裸题
- AC自动机(Aho-Corasick automation)模板 HDU:2222
- hdu 2222 AC自动机 first