AC自动机板子(from. qwer)
来源:互联网 发布:godaddy域名转出 万网 编辑:程序博客网 时间:2024/05/24 07:20
#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <iostream>#include <string>#include <queue>using namespace std;const int N=510000;struct Tri{ int Next[N][26], fail[N], val[N], root, L; void init() {L = 0;root = newnode();} int newnode() { for(int i = 0;i < 26;i++) Next[L][i] = -1; val[L++] = 0; return L - 1; } void insert(char s[]) { int len = strlen(s), cur = root; for(int i = 0;i < len;i++) { if(Next[cur][s[i]-'a'] == -1) Next[cur][s[i]-'a'] = newnode(); cur = Next[cur][s[i]-'a']; } val[cur]++; } void build() { queue<int>Q; fail[root] = root; 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 cur = Q.front(); Q.pop(); for(int i = 0;i < 26;i++) if(Next[cur][i] == -1) Next[cur][i] = Next[fail[cur]][i]; else { fail[Next[cur][i]]=Next[fail[cur]][i]; Q.push(Next[cur][i]); } } } int query(char s[]) { int len = strlen(s), cur = root, res = 0; for(int i = 0;i < len;i++) { cur = Next[cur][s[i]-'a']; int tmp = cur; while (tmp != root) { res += val[tmp]; val[tmp] = 0; tmp = fail[tmp]; } } return res; }};char s[N];Tri AC;int n;int main(){ scanf("%d",&n); AC.init(); for(int i = 0;i < n;i++) { scanf("%s",s); AC.insert(s); } AC.build(); scanf("%s",s); printf("%d\n",AC.query(s)); return 0;}
0 0
- AC自动机板子(from. qwer)
- AC自动机板子(指针,数组)
- hdu_2222_Keywords Search(AC自动机板子)
- trie树+AC自动机板子
- HDU 2222 (AC自动机 板子题)
- HDU 2243 AC自动机->DP->附矩阵乘法板子
- hdu-2222 Keywords Search (AC自动机板子题)
- 自动机理论(AC自动机)
- AC-自动机(AC-Automachine)
- hdu2222,(ac自动机)
- AC自动机(hdu4057)
- hdu2896(AC自动机)
- hdu3065(AC自动机)
- hdu2222(AC自动机)
- bzoj3172(ac自动机)
- HDU2222(AC自动机)
- AC 自动机(模板)
- AC自动机(hdu2222)
- 洛谷1004方格取数
- 单反入门
- adaboost迭代次数的理解
- ireport使用笔记(关键释义、常见问题及解决方法)
- java常用string inputStream转换
- AC自动机板子(from. qwer)
- 微信高可用分布式数据库PhxSQL设计与实现
- Markdown简介
- 字符串折叠(大视野在线测评)
- js生成二维码
- 主题模型分析
- codevs1002 搭桥
- zxing 生成二维码
- XXy