hdu 5384 Danganronpa AC自动机
2015-08-18 16:13
176 查看
求目标串中出现了几个模式。模板题
#include<stdio.h> #include<string.h> #include<math.h> #include<queue> #include<vector> #include<iostream> #include<string> #include<set> #include<map> #include<algorithm> using namespace std; #pragma comment(linker, "/STACK:1024000000,1024000000") #define nn 1000010 #define ll long long #define ULL unsiged long long #define mod 0x7fffffff #define inf oxfffffffffff #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 //// ((`'-"` `""-'`)) //// ) - - ( //// / (o _ o) \ //// \ ( 0 ) / //// _'-.._ '=' _..-'_ //// /`;#'#'#. -. #'#'#;`\ //// \_)) '#' ((_/ //// #. ☆ ☆ ☆ .# //// '#. 求 A C! .#' //// /'#. .#'\ //// _\\'#. .#'//_ //// (((___)'#'(___))) //-----------------------------SB-----------------------------------// struct Trie { int next[500010][26],fail[500010],last[500010]; int root,L; int newnode() { for(int i = 0;i < 26;i++) next[L][i] = -1; last[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']; } last[now]++; } 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 now = Q.front(); Q.pop(); for(int i = 0;i < 26;i++) if(next[now][i] == -1) next[now][i] = next[fail[now]][i]; else { fail[next[now][i]]=next[fail[now]][i]; Q.push(next[now][i]); } } } int query(char buf[]) { int len = strlen(buf); int now = root; int res = 0; for(int i = 0;i < len;i++) { now = next[now][buf[i]-'a']; int temp = now; while( temp != root ) { res += last[temp]; //last[temp] = 0; temp = fail[temp]; } } return res; } void debug() { for(int i = 0;i < L;i++) { printf("id = %3d,fail = %3d,last = %3d,chi = [",i,fail[i],last[i]); for(int j = 0;j < 26;j++) printf("%2d",next[i][j]); printf("]\n"); } } }; char buf[1000010]; Trie ac; char mp[100004][10005]; int main() { int T; int n,m; scanf("%d",&T); while( T-- ) { scanf("%d%d",&n,&m); ac.init(); for(int i = 0;i < n;i++) scanf("%s",mp[i]); for(int i=0;i<m;i++) { scanf("%s",buf); ac.Insert(buf); } ac.build(); //scanf("%s",buf); for(int i=0;i<n;i++) printf("%d\n",ac.query(mp[i])); } return 0; }
相关文章推荐
- nginx模块编程之获取客户ip及端口号
- 官方文档地址
- hdoj 2196 Computer【树的直径求所有的以任意节点为起点的一个最长路径】
- WPS常用操作02——如何禁止单词首写自动大写
- freemaker html页面获取map的key和value
- IIS页面报错“NT AUTHORITY\NETWORK SERVICE 没有访问temp目录的足够权限”
- Object-C 和 Swift 混编 之二 Swift 中调用 Object-C
- server name 问题
- iOS判断当前控制器是否在显示
- Global.asax 文件是什么
- Labeling Balls POJ3687 【拓扑排序反向建边】【邻接表】
- 插入排序
- eclipse中ant build 控制台乱码解决解决方法(ant执行java)
- iPhone 6s上市时间曝光 首发或包含中国大陆
- 获取TextView中的url并设置点击事件
- sql语句分组统计出年月日下数据记录数目
- Lambda表达式补充
- 42个自我提升的实用技巧
- TCP粘包的拆包处理
- C++ 子类继承父类 之 构造函数