P3808 【模板】AC自动机(简单版)
2018-07-23 17:54
253 查看
P3808 【模板】AC自动机(简单版)
https://www.luogu.org/problemnew/show/P3808
分析:建立AC自动机,然后在文本串扫一遍,统计每个串出现的次数。
代码:
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N = 500100; char str[N << 1], s[110]; int ch [26], fail , val , last , q , L, R, Index; void Insert(char *s) { int len = strlen(s), u = 0; for (int i=0; i<len; ++i) { int c = s[i] - 'a'; if (!ch[u][c]) ch[u][c] = ++Index; u = ch[u][c]; } val[u] ++; } void build() { L = 1;R = 0; fail[0] = 0; for (int c=0; c<26; ++c) { int u = ch[0][c]; if (u) fail[u] = 0, q[++R] = u, last[u] = 0; } while (L <= R) { int u = q[L++]; for (int c=0; c<26; ++c) { int v = ch[u][c]; if (!v) { ch[u][c] = ch[fail[u]][c]; continue; } q[++R] = v; int p = fail[u]; while (p && !ch[p][c]) p = fail[p]; fail[v] = ch[p][c]; last[v] = val[fail[v]] ? fail[v] : last[fail[v]]; } } } int find(char *s) { int Ans = 0, u = 0, len = strlen(s); for (int i=0; i<len; ++i) { int c = s[i] - 'a'; u = ch[u][c]; if (val[u]) Ans += val[u], val[u] = 0; int p = u; while (last[p]) { p = last[p]; if (val[p]) Ans += val[p], val[p] = 0; } } return Ans; } int main () { int n; scanf("%d", &n); while (n--) { scanf("%s", s); Insert(s); } build(); scanf("%s",str); printf("%d\n",find(str)); return 0; }
相关文章推荐
- P3808 【模板】AC自动机(简单版)
- luogu P3808 【模板】AC自动机(简单版)
- P3808 【模版】AC自动机(简单版)
- luogu P3808 【模板】AC自动机(简单版)
- P3808 【模版】AC自动机(简单版)
- [洛谷3808]【模板】AC自动机(简单版)
- 【洛谷】3808 【模板】AC自动机(简单版)
- AC自动机模板
- HDU 2222 Keywords Search (AC自动机模板)
- P3796 【模板】AC自动机(加强版)
- ac自动机模板-kuangbin
- ac自动机模板
- HDU2222 Keywords Search [AC自动机模板]
- AC自动机算法及模板
- HDU 2222 ac自动机模板题
- HDU2896.病毒侵袭中【MLE和PE的原因】【AC自动机模板题】
- AC自动机入门题目(HDU - 2222 )+模板+解释
- 字典树模板/ac自动机模板
- 【AC自动机详解+入门模板】HDU 2222
- 病毒侵袭(我的第二道AC自动机(模板进一步升级完善))