白书上的AC自动机模板
2014-08-04 20:26
204 查看
//trie,感觉就是字典树 struct Trie{ int ch[maxnode][sigma_size]; int val[maxnode]; int sz; Trie() {sz = 1;memset(ch[0],0,sizeof(ch[0]));} int idx(char c) { return c-'a';} void insert(char *s,int v){ int u=0,n=strlen(s); for(int i=0;i<n;i++) { int c=idx(s[i]); if(!ch[u][c]){ memset(ch[sz],0,sizeof(ch[sz])); val[sz]=v; ch[u][c]=sz++; } u=ch[u][c]; } val[u]=v; <pre name="code" class="cpp">//获取失配函数 void getFail() { queue<int>q; f[0]=0; //失配函数 for(int c=0;c<sigma_size;c++){ int u=ch[0][c]; if(u){f[u]=0;q.push(u);last[u]=0} //last数组存的是当前节点前一个单词的末尾节点坐标 } while(!q.empty()){ int r=q.front();q.pop(); for(int c=0;c<sigma_size;c++){ int u=ch[r][c]; if(!u){ch[r][c]=ch[f[r]][c];continue;} //对所有不存在的边建立状态转移边 q.push(u); int v=f[r]; while(v && !ch[v][c]) v=f[v]; //直到找到匹配节点或者返回到root点 f[u]=ch[v][c]; last[u]=val[f[u]]?f[u]:last[f[u]]; } } }
void find(char* t) { int n=strlen(t); int j=0; for(int i=0;i<n;i++) { int c=idx(t[i]); j=ch[j][c]; //因为对不存在的点也建立了状态转移边 if(val[j]) print(i,j); else if(last[j]) print(i,j); } }
相关文章推荐
- HDU 2222 Keywords Search(AC自动机模板)
- AC自动机-HDU2896-模板题
- hdu2222(ac自动机模板)
- 白书上的2-SAT模板
- HDU2222 Keywords Search(AC自动机模板)
- Match:Keywords Search(AC自动机模板)(HDU 2222)
- ac自动机模板
- HDU 2222 Keywords Search 【AC自动机模板】
- hdu 2222 ac自动机模板
- AC自动机 模板
- AC自动机(1)--hdu2222(基本模板)
- HDU 2222 AC自动机模板
- ac自动机模板(hdu2222)
- AC自动机 白书模板
- 我的ac自动机模板
- AC自动机模板
- AC自动机入门+模板 (HDU 2222)
- hdu 3065 病毒侵袭持续中 AC自动机模板题 ,,一A。
- cjoj P1435 - 【模板题 USACO】AC自动机 && 洛谷 P3796 【模板】AC自动机(加强版)
- HDU2222 Keywords Search 【AC自动机模板题】