【模板】AC自动机
2017-09-14 14:17
127 查看
#include <queue> #include <cstdio> #include <cstring> #define N 1000001 int n, cnt, ans; int next [26], val , fail ; char s ; std::queue <int> q; inline void insert() { int i, x, now = 0, m = strlen(s + 1); for(i = 1; i <= m; i++) { x = s[i] - 'a'; if(!next[now][x]) next[now][x] = ++cnt; now = next[now][x]; } val[now]++; } inline void make_fail() { int i, now; for(i = 0; i < 26; i++) if(next[0][i]) q.push(next[0][i]); while(!q.empty()) { now = q.front(); q.pop(); for(i = 0; i < 26; i++) { if(!next[now][i]) { next[now][i] = next[fail[now]][i]; continue; } fail[next[now][i]] = next[fail[now]][i]; q.push(next[now][i]); } } } inline void ac() { int i, j, now = 0, m = strlen(s + 1); for(i = 1; i <= m; i++) { now = next[now][s[i] - 'a']; for(j = now; j && ~val[j]; j = fail[j]) { ans += val[j]; val[j] = -1; } } } int main() { int i; scanf("%d", &n); for(i = 1; i <= n; i++) { scanf("%s", s + 1); insert(); } make_fail(); scanf("%s", s + 1); ac(); printf("%d\n", ans); return 0; }
#include <queue> #include <cstdio> #include <cstring> #define N 1000001 #define max(x, y) ((x) > (y) ? (x) : (y)) int n, cnt; int val , next [26], ans , fail ; char s1[151][71], s2 ; std::queue <int> q; inline void insert(int k, char *s) { int i, x, now = 0, m = strlen(s + 1); for(i = 1; i <= m; i++) { x = s[i] - 'a'; if(!next[now][x]) next[now][x] = ++cnt; now = next[now][x]; } val[now] = k; } inline void make_fail() { int i, now; for(i = 0; i < 26; i++) if(next[0][i]) q.push(next[0][i]); while(!q.empty()) { now = q.front(); q.pop(); for(i = 0; i < 26; i++) { if(!next[now][i]) { next[now][i] = next[fail[now]][i]; continue; } fail[next[now][i]] = next[fail[now]][i]; q.push(next[now][i]); } } } inline void ac(char *s) { int i, j, now = 0, m = strlen(s + 1); for(i = 1; i <= m; i++) { now = next[now][s[i] - 'a']; for(j = now; j; j = fail[j]) if(val[j]) ans[val[j]]++; } for(i = 1; i <= n; i++) ans[0] = max(ans[0], ans[i]); printf("%d\n", ans[0]); for(i = 1; i <= n; i++) if(ans[i] == ans[0]) printf("%s\n", s1[i] + 1); } int main() { int i; while(scanf("%d", &n) && n) { cnt = 0; memset(val, 0, sizeof(val)); memset(ans, 0, sizeof(ans)); memset(next, 0, sizeof(next)); memset(fail, 0, sizeof(fail)); for(i = 1; i <= n; i++) { scanf("%s", s1[i] + 1); insert(i, s1[i]); } make_fail(); scanf("%s", s2 + 1); ac(s2); } return 0; }
相关文章推荐
- [HDU 3065]病毒侵袭持续中[AC自动机][模板题]
- hdu2222 ac自动机模板
- AC自动机 ( 模板题啊 )——病毒侵袭持续中 ( HDU 3065 )
- 【AC自动机模板】(转自木子日匀大神)
- ac自动机模板
- [模板] - AC自动机 - 动态 - 感谢小太阳
- AC自动机模板
- AC自动机 模板与简单讲解 模板题:贴瓷砖
- AC自动机模板
- hdu 2222 ac自动机模板题
- AC自动机(模板)
- 【模板练习——AC自动机】Keywords Search HDU - 2222
- AC自动机入门+模板 (HDU 2222)
- AC自动机模板【洛谷3796】
- HDU-2222 Keywords Search (AC自动机模板)
- AC自动机模板
- 【洛谷P3796】【模板】AC自动机(加强版)
- 【洛谷】3808 【模板】AC自动机(简单版)
- AC自动机模板
- HDU2896【AC自动机-模板】