AC自动机模板
2015-08-31 18:38
369 查看
代码(放牛的模板):
#include<iostream> #include<string.h> #include<stdio.h> #include<algorithm> #include<queue> using namespace std; const int maxa = 500000; const int cha = 26; int n, m, k; vector<int>edge[505]; struct Tire{ int next[maxa][cha], fail[maxa], end[maxa]; int root, L; int newnode(){ for(int i = 0; i < cha; i++){ next[L][i] = -1; } end[L++] = 0; return L-1; } void init(){ L = 0; root = newnode(); } void insert(char buf[]){ 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']; //printf("%d ", now); }//puts(""); end[now] ++; } void build(){ for(int i = 0; i < L; i++){ edge[i].clear(); } queue<int>Q; fail[root] = root; for(int i = 0; i < cha; i++){ if(next[root][i] == -1) ; else{ edge[0].push_back(next[root][i]); edge[next[root][i]].push_back(0); Q.push(next[root][i]); } } while(!Q.empty()){ int now = Q.front(); Q.pop(); // end[now] |= end[fail[now]]; for(int i = 0; i < cha; i++){ if(next[now][i] == -1); else{ edge[next[now][i]].push_back(now); edge[now].push_back(next[now][i]); Q.push(next[now][i]); // printf("**%d %d\n",next[now][i],next[fail[now]][i]); } } } } }ac; int maxn; void dfs(int ii, int fa, int dep){//printf("%d == ii\n", ii); if(edge[ii].size() == 1){ maxn += dep; } for(int i = 0; i < edge[ii].size(); i++){ int k = edge[ii][i]; if(k != fa){ dfs(k, ii, dep+1); } } } int solve(){ int ans = 1000000; maxn = 0; for(int i = 0;i < ac.L; i++){ maxn = 0; dfs(i, -1, 0); //printf("%d == maxn\n", maxn); ans = min(ans, maxn); } return ans; } char buf[1000005]; int main(){ int t, n; scanf("%d", &t); int cas = 1; while(t--){ scanf("%d", &n); ac.init(); //memset(ac.end, 0, sizeof(ac.end)); for(int i = 0; i < n; i++){ scanf("%s", buf); ac.insert(buf); } ac.build(); printf("Case #%d: %d\n", cas++, solve()); } } /* abcdefg bcdefg cdef de e ssaabcdefg */
相关文章推荐
- HDU-4751 Divide Groups
- three.js、webGL、canvas区别于关联
- 人丑就要多读书(14)
- rabbitmq的启动问题
- MFC对话框整合
- UITableview reloadData偶尔出现崩溃
- Cloudera-Manager修改集群的IP
- Java SHA-256 算法实例
- 【学习笔记】孤儿进程和僵尸进程
- freemarker程序开发
- js编码后台解码
- X86 openWRT 虚拟机编译教程 在ubuntu10中X86 OpenWRT的源码编译
- 一次完整的HTTP请求所经历的7个步骤
- ISO/IEC 9899:2011 条款6.4——词法元素
- Cloudera-Manager修改集群的IP
- web工程引用其他java工程解决方法
- Python单元测试框架Pytest——如何生成测试报告
- Android学习笔记(五)Fragment简介
- NGUI消耗性能分析
- 利用Amazon Mobile Analytics与R深入探究移动应用的使用模式