hdu5384
来源:互联网 发布:电力监控软件 编辑:程序博客网 时间:2024/04/29 20:26
题意:给你n个母串,m个匹配串,让你求出对于每个母串 所有匹配串出现的次数和。
思路:完完全全邝斌的模板啊。。。 注释掉一行代码就能a。。。。
代码:
#include <algorithm>#include <iostream>#include <sstream>#include <cstdlib>#include <cstring>#include <iomanip>#include <cstdio>#include <string>#include <bitset>#include <vector>#include <queue>#include <stack>#include <cmath>#include <list>#include <map>#include <set>#define sss(a,b,c) scanf("%d%d%d",&a,&b,&c)#define mem1(a) memset(a,-1,sizeof(a))#define mem(a) memset(a,0,sizeof(a))#define ss(a,b) scanf("%d%d",&a,&b)#define s(a) scanf("%d",&a)#define p(a) printf("%d\n", a)#define INF 0x3f3f3f3f#define w(a) while(a)#define PI acos(-1.0)#define LL long long#define eps 10E-9#define N 100010#define mod 258280327const int SIGMA_SIZE=26;const int MAXN=100010;const int MAXNODE=600010;using namespace std;void mys(int& res){ int flag=0; char ch; while(!(((ch=getchar())>='0'&&ch<='9')||ch=='-')) if(ch==EOF) res=INF; if(ch=='-') flag=1; else if(ch>='0'&&ch<='9') res=ch-'0'; while((ch=getchar())>='0'&&ch<='9') res=res*10+ch-'0'; res=flag?-res:res;}void myp(int a){ if(a>9) myp(a/10); putchar(a%10+'0');}/*************************THE END OF TEMPLATE************************/char str1[N][10001];char s[N];int m, ans;struct ac_trie{ int next[500010][26], ed[500010], fail[500010]; int root, L; int newnode(){ for(int i=0; i<26; i++) next[L][i] = -1; ed[L++] = 0; return L-1; } void init(){ L = 0; root = newnode(); } void m_insert(char *s){ int len = strlen(s); int now = root; for(int i = 0; i<len; i++){ if(next[now][s[i]-'a'] == -1) next[now][s[i]-'a'] = newnode(); now = next[now][s[i]-'a']; } ed[now]++; } void getfail(){ 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]); } w(!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 *s){ int len = strlen(s); int now = root; int res = 0; for(int i=0; i<len; i++){ now = next[now][s[i]-'a']; int temp = now; w(temp!=root){ res += ed[temp]; //ed[temp] = 0; temp = fail[temp]; } } return res; }};ac_trie ac;int main(){ int t, n; s(t); w(t--){ ss(n, m); ac.init(); for(int i=0; i<n; i++) scanf("%s",str1[i]); for(int i=0; i<m; i++){ scanf("%s", s); ac.m_insert(s); } ac.getfail(); for(int i=0; i<n; i++) p(ac.query(str1[i])); } return 0;}
1 0
- hdu5384
- HDU5384 Danganronpa
- 【字符串】hdu5384
- hdu5384 Danganronpa
- hdu5384(AC自动机)
- hdu5384(AC自动机)
- hdu5384 Danganronpa(AC自动机)
- hdu5384-多校 ac自动机
- hdu5384 Danganronpa (AC自动机)
- hdu5384(AC自动机+纪录重复单词出现的次数)
- hdu5384 Danganronpa AC自动机 多校联合第八场
- 2015 多校联赛 ——HDU5384(AC自动机)
- hdu5384(2015多校8)--Danganronpa(AC自动机)
- 2015 Multi-University Training Contest 8(hdu5384,AC自动机)
- hdu5384 AC自动机模板题,统计模式串在给定串中出现的个数
- hdu5384 Danganronpa(ac自动机+处理源字符串总容量超过二维数组容量的技巧(连接+分割))
- WPF_常用字典扩展方法
- Simple Game
- web开发的编码本质
- ListView没有分割线
- POJ 3687 Labeling Balls (逆向建边)
- hdu5384
- No enclosing instance of type WallpaperService is available due to some intermediate constructor inv
- 黑马程序员——java复习总结——泛型和Map
- 用CSS实现层的垂直居中
- android 安装目录介绍
- caffe util 函数介绍
- matlab:Excel数据导入C程序中
- css3的Background新属性
- mysql 视图、存储过程和函数