【AC自动机模板】(转自木子日匀大神)
2014-06-30 19:05
204 查看
看了昀神的AC自动机,好棒啊~~~好棒啊。。。赶紧转过来了。。。。。
字典树上建失败指针什么的。
一个比较好的方法是稍微修改一下next的定义。
原来next[i][j]表示字典树中i节点的字符为j的儿子节点编号。
现在拓展一下。如果i节点没有字符为j的儿子,那么next[i][j]就是i节点沿着失败指针一直走到有字符为j的儿子的节点编号,如果没有,那么就指向根。
相当于是一个路径压缩的思想吧。这样一来,建立完自动机后,next指针就是很直接的转移关系了,不需要再特意的沿着失败指针跑啊跑的。
这种写法实现起来和用起来都很方便。
字典树上建失败指针什么的。
一个比较好的方法是稍微修改一下next的定义。
原来next[i][j]表示字典树中i节点的字符为j的儿子节点编号。
现在拓展一下。如果i节点没有字符为j的儿子,那么next[i][j]就是i节点沿着失败指针一直走到有字符为j的儿子的节点编号,如果没有,那么就指向根。
相当于是一个路径压缩的思想吧。这样一来,建立完自动机后,next指针就是很直接的转移关系了,不需要再特意的沿着失败指针跑啊跑的。
这种写法实现起来和用起来都很方便。
struct trie { int next[1100][26],fail[1100],end[1100]; int L,root; int newnode() { for (int i = 0;i < 26;i++) next[L][i] = -1; end[L++] = 0; return L-1; } void init() { L = 0; root = newnode(); } void insert(char buf[],int val) { int len = strlen(buf); int now = root; for (int i = 0;i < len;i++) { if (next[now][buf[i]-'a'] == -1) next[now][buf[i]-'a'] = newnode(); now = next[now][buf[i]-'a']; } end[now] += val; } void build() { queue<int> Q; for (int i = 0;i < 26;i++) if (next[root][i] == -1) next[root][i] = root; else { fail[next[root][i]] = root; Q.push(next[root][i]); } while (!Q.empty()) { int now = Q.front(); Q.pop(); end[now] += end[fail[now]]; for (int i = 0;i < 26;i++) if (next[now][i] == -1) next[now][i] = next[fail[now]][i]; else { fail[next[now][i]] = next[fail[now]][i]; Q.push(next[now][i]); } } } };
相关文章推荐
- 【KD树】 学习资料(转自木子日匀大神)
- AC自动机 白书模板
- hdu 2222 ac自动机模板题
- AC自动机模板
- AC自动机算法及模板
- AC自动机 模板
- AC自动机模板(【CJOJ1435】)
- AC自动机模板
- AC自动机 多模式串匹配 模板
- AC自动机模板3【洛谷3796】
- ac自动机代码模板
- AC自动机 模板 hdu 2896
- AC自动机模板
- AC自动机模板
- hdu 2222 Keywords Search(AC自动机模板)
- 字符串匹配--AC自动机模板
- AC自动机 ( 动态建树模板 )——Keywords Search ( HDU 2222 )
- AC自动机算法及模板
- AC自动机 - 多模式串的匹配 --- HDU 3695 Computer Virus on Planet Pandora(模板题)
- 模板_KMP和AC自动机