字典树模板/ac自动机模板
2014-09-05 16:01
465 查看
#define maxnode 60101 #define sigma_size 26 struct trie { int ch[maxnode][sigma_size]; int val[maxnode]; int sz; void init() { cler(ch[0],0); sz=1; } int newnode() { cler(ch[sz],0); val[sz]=0; return sz++; } int idx(char s) { return s-'a'; } void insert(char *s) { int u=0,len=strlen(s); for(int i=0;i<len;i++) { int c=idx(s[i]); if(!ch[u][c]) ch[u][c]=newnode(); u=ch[u][c]; } val[u]++; } }ac;
////////////////////////////////////////////////////////
last数组储存着失配指针上的单词结尾的结点编号
#define maxnode 500101 #define sigma_size 26 struct trie { int ch[maxnode][sigma_size]; int val[maxnode]; int fail[maxnode]; int last[maxnode]; int sz; void init() { cler(ch[0],0); cler(last,0); cler(fail,0); sz=1; } int newnode() { cler(ch[sz],0); val[sz]=0; return sz++; } int idx(char s) { return s-'a'; } void insert(char *s) { int u=0,len=strlen(s); for(int i=0;i<len;i++) { int c=idx(s[i]); if(!ch[u][c]) ch[u][c]=newnode(); u=ch[u][c]; } val[u]++; } void getfail() { queue<int>q; fail[0]=0; for(int i=0;i<sigma_size;i++) { int u=ch[0][i]; if(u) {fail[u]=0;q.push(u);last[u]=0;} } while(!q.empty()) { int r=q.front();q.pop(); for(int c=0;c<sigma_size;c++) { int u=ch[r][c]; if(!u) continue; q.push(u); int v=fail[r]; while(v&&!ch[v][c]) v=fail[v]; fail[u]=ch[v][c]; last[u]=val[fail[u]]?fail[u]:last[fail[u]]; } } } int find(char *s) { int u=0,len=strlen(s),ans=0; for(int i=0;i<len;i++) { int c=idx(s[i]); while(u&&!ch[u][c]) u=fail[u]; u=ch[u][c]; int temp=u; while(val[temp]&&temp) { ans+=val[temp]; val[temp]=0; temp=fail[temp]; } } return ans; } }ac;
相关文章推荐
- 字典树模板/ac自动机模板
- 【HDU2896】病毒侵袭-AC自动机模板题
- hdu 2222(AC自动机模板)
- HDU 1251 (统计难题) 字典树模板&&map实现
- hdu 1075 What Are You Talking About 字典树模板
- 统计难题(字典树模板)
- ac自动机模板 1
- 【模板】AC自动机(加强版) 洛谷3796 AC自动机
- AC自动机-HDU2896-模板题
- 【字符串匹配】字典树模板
- Trie(字典树模板)
- AC自动机模板
- Hdu 1671 -Phone List (字典树模板)
- HDU2222 Keywords Search [AC自动机模板]
- HDU1251统计难题(字典树模板)
- 字典树模板题(la3942)
- HDU 1075 What Are You Talking About(字典树模板题)
- 字典树模板
- 【AC自动机详解+入门模板】HDU 2222
- luogu3796【模板】AC自动机(加强版)