AC自动机 模板
2016-10-12 10:08
274 查看
测试题目:HDU 2222,
const int maxn = 10000 * 50 + 50,sigma_size = 26; /** AC_AUTOMATION */ int ch[maxn][sigma_size],fail[maxn],tot; int value[maxn]; /** 初始化 */ void Init(){ memset(ch[0],0,sizeof ch[0]); tot = 1; fail[0] = -1;value[0] = 0; } /** 插入字符串 s */ void Insert(char* s){ int idx,cur = 0; while( *s ){ idx = *s - 'a'; if(ch[cur][idx] == 0){ memset(ch[tot],0,sizeof ch[tot]); fail[tot] = 0; value[tot] = 0; ch[cur][idx] = tot++; } cur = ch[cur][idx]; s++; } value[cur]++; } /** GetFail */ void GetFail(){ queue<int> Q; Q.push(0); fail[0] = -1; int cur,idx,f; while(!Q.empty()){ cur = Q.front();Q.pop(); for(int i = 0;i < sigma_size;++i){ if(ch[cur][i]){ f = fail[cur]; while(f != -1 && ch[f][i] == 0) f = fail[f]; fail[ch[cur][i]] = (f == -1) ? 0 : ch[f][i]; Q.push(ch[cur][i]); } else{ f = fail[cur]; ch[cur][i] = (f == -1) ? 0 : ch[f][i]; } } } } /** 以上具有通用性 */ /** 匹配 */ int Search(char *s){ int cur = 0,idx,ret = 0,tmp; while(*s){ idx = *s - 'a'; tmp = cur = ch[cur][idx]; if(value[tmp]) while(tmp){ ret += value[tmp];value[tmp] = 0; tmp = fail[tmp]; } s++; } return ret; }
相关文章推荐
- hdu 3695 AC自动机模板题
- AC自动机 ( 动态建树模板 )——Keywords Search ( HDU 2222 )
- AC自动机模板
- ac自动机背诵用模板
- AC自动机模板
- 【BZOJ3172】【Tjoi2013】单词 AC自动机模板题
- 洛谷.3808/3796.[模板]AC自动机
- HDU 2222 Keywords Search(我的第一道AC自动机,模板题)
- HDU 2222 Keywords Search(AC自动机 模板)
- ac自动机模板hdu2222
- AC自动机算法模板
- hdu 2222 Keywords Search(AC自动机模板)
- AC自动机 模板 【HDU2222】 Keywords Search
- 洛谷 P3796 【模板】AC自动机(加强版)
- hdu2222&hdu3065 AC自动机模板题
- AC自动机 模板
- HDU 2222 Keywords Search 【AC自动机模板】
- hdu5384 AC自动机模板题,统计模式串在给定串中出现的个数
- 裸模板:AC自动机
- AC自动机学习小记 Hdu 2222 Keywords Search (模板)