博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P3796 AC自动机
阅读量:4951 次
发布时间:2019-06-11

本文共 2765 字,大约阅读时间需要 9 分钟。

AC自动机模板

#include 
#define INF 0x3f3f3f3f#define full(a, b) memset(a, b, sizeof a)#define __fastIn ios::sync_with_stdio(false), cin.tie(0)#define pb push_backusing namespace std;using LL = long long;inline int lowbit(int x){ return x & (-x); }inline int read(){ int ret = 0, w = 0; char ch = 0; while(!isdigit(ch)){ w |= ch == '-', ch = getchar(); } while(isdigit(ch)){ ret = (ret << 3) + (ret << 1) + (ch ^ 48); ch = getchar(); } return w ? -ret : ret;}template
inline A __lcm(A a, A b){ return a / __gcd(a, b) * b; }template
inline A fpow(A x, B p, C lyd){ A ans = 1; for(; p; p >>= 1, x = 1LL * x * x % lyd)if(p & 1)ans = 1LL * x * ans % lyd; return ans;}const int N = 200;const int M = 100005;int n, tot, cnt, trie[M][26], ending[M], iex[N], fail[M], freq[M], head[M];string s[N], t;struct Edge { int v, next; } edge[M<<1];void addEdge(int a, int b){ edge[cnt].v = b, edge[cnt].next = head[a], head[a] = cnt ++;}void init(){ tot = cnt = 0; full(ending, 0), full(iex, 0), full(freq, 0); full(trie, 0), full(head, -1);}void insert(const string &buf, int j){ int p = 0; for(int i = 0; i < buf.size(); i ++){ int ch = buf[i] - 'a'; if(!trie[p][ch]) trie[p][ch] = ++ tot; p = trie[p][ch]; } ending[p] ++, iex[j] = p;}void getFail(){ full(fail, 0); queue
q; for(int i = 0; i < 26; i ++){ if(trie[0][i]) q.push(trie[0][i]); } while(!q.empty()){ int s = q.front(); q.pop(); for(int i = 0; i < 26; i ++){ if(trie[s][i]){ fail[trie[s][i]] = trie[fail[s]][i]; q.push(trie[s][i]); } else trie[s][i] = trie[fail[s]][i]; } }}void buildFailTree(){ for(int i = 1; i <= tot; i ++){ addEdge(fail[i], i), addEdge(i, fail[i]); }}void dfs(int s, int fa){ for(int i = head[s]; i != -1; i = edge[i].next){ int u = edge[i].v; if(u == fa) continue; dfs(u, s); freq[s] += freq[u]; }}void query(const string &buf){ int p = 0, maxl = 0; for(int i = 0; i < buf.size(); i ++){ p = trie[p][buf[i] - 'a']; freq[p] ++; } dfs(0, 0); for(int i = 1; i <= n; i ++){ maxl = max(maxl, freq[iex[i]]); } cout << maxl << endl; for(int i = 1; i <= n; i ++){ if(maxl == freq[iex[i]]){ cout << s[i] << endl; } }}int main(){ __fastIn; while(cin >> n && n){ init(); for(int i = 1; i <= n; i ++){ cin >> s[i]; insert(s[i], i); } getFail(), buildFailTree(); cin >> t; query(t); } return 0;}

转载于:https://www.cnblogs.com/onionQAQ/p/11373923.html

你可能感兴趣的文章
mariadb BINLOG_FORMAT = STATEMENT 异常
查看>>
如何监视性能和分析等待事件
查看>>
C3P0 WARN: Establishing SSL connection without server's identity verification is not recommended
查看>>
iPhone在日本最牛,在中国输得最慘
查看>>
动态方法决议 和 消息转发
查看>>
关于UI资源获取资源的好的网站
查看>>
WPF自定义搜索框代码分享
查看>>
js 基础拓展
查看>>
Windows下常用测试命令
查看>>
SpringBoot访问html访问不了的问题
查看>>
{width=200px;height=300px;overflow:hidden}
查看>>
C#生成随机数
查看>>
CSS基础学习 20.CSS媒体查询
查看>>
2019春季第十一周作业
查看>>
洛谷P4591 [TJOI2018]碱基序列 【KMP + dp】
查看>>
iOS CoreData介绍和使用(以及一些注意事项)
查看>>
OS笔记047代理传值和block传值
查看>>
Android应用程序与SurfaceFlinger服务的连接过程分析
查看>>
coco2dx服务器简单例子
查看>>
Java回顾之多线程
查看>>