HDU 5384 Danganronpa(AC自动机)
2015-08-14 10:41
387 查看
Description
给出n个文本串和m个模式串,问每个文本串中模式串出现次数
Input
第一行为用例组数T,每组用例第一行为两个整数n和m分别表示文本串个数和模式串个数,之后n行每行一个文本串Ai,最后m行每行一个模式串Bi(T≤10,n,m≤10^5, 1≤|Ai|,|Bj|≤10^4, ∑|Ai|≤10^5, ∑|Bj|≤10^5,∑|Ai|≤6∗10^5, ∑|Bj|≤6∗10^5,文本串和模式串均由小写字母组成)
Output
对于每组用例,输出每个文本串中模式串出现次数
Sample Input
1
5 6
orz
sto
kirigiri
danganronpa
ooooo
o
kyouko
dangan
ronpa
ooooo
ooooo
Sample Output
1
1
0
3
7
Solution
AC自动机裸题,注意文本串的存储问题
Code
给出n个文本串和m个模式串,问每个文本串中模式串出现次数
Input
第一行为用例组数T,每组用例第一行为两个整数n和m分别表示文本串个数和模式串个数,之后n行每行一个文本串Ai,最后m行每行一个模式串Bi(T≤10,n,m≤10^5, 1≤|Ai|,|Bj|≤10^4, ∑|Ai|≤10^5, ∑|Bj|≤10^5,∑|Ai|≤6∗10^5, ∑|Bj|≤6∗10^5,文本串和模式串均由小写字母组成)
Output
对于每组用例,输出每个文本串中模式串出现次数
Sample Input
1
5 6
orz
sto
kirigiri
danganronpa
ooooo
o
kyouko
dangan
ronpa
ooooo
ooooo
Sample Output
1
1
0
3
7
Solution
AC自动机裸题,注意文本串的存储问题
Code
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; char str[666666];//用str数组存储n个文本串 struct Trie { int next[666666][26],fail[666666],end[666666]; int root,L; int newnode() { for(int i=0;i<26;i++) next[L][i]=-1; end[L++]=-1; return L-1; } void init() { L=0; root=newnode(); } void 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']; } end[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]); } } } void query(char buf[],int n) { int len=strlen(buf); int now=root; int num=0; for(int i=0;i<len;i++) { now=next[now][buf[i]-'a']; int temp=now; while(temp!=root) { if(end[temp]!=-1) num+=end[temp]+1; temp=fail[temp]; } } printf("%d\n",num); } }; char buf[11111]; Trie ac; int main() { int T,n,m; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); ac.init();//初始化 int len[111111]; char temp[11111]; len[0]=0;//len数组存储每个文本串在str数组中的开始位置 for(int i=1;i<=n;i++) { scanf("%s",temp); len[i]=len[i-1]+strlen(temp); for(int j=len[i-1]+1,k=0;j<=len[i];j++,k++) str[j]=temp[k]; } str[0]='$'; str[len +1]='\0'; for(int i=0;i<m;i++) { scanf("%s",buf); ac.insert(buf);//插入模式串 } ac.build();//建树 for(int i=1;i<=n;i++) { int j,k; for(k=0,j=len[i-1]+1;j<=len[i];j++,k++)//取出文本串 temp[k]=str[j]; temp[k]='\0'; ac.query(temp,m);//查询 } } return 0; }
相关文章推荐
- 跟我一起学习VIM - The Life Changing Editor
- 使用Socket创建带连接池的多线程文件传输服务器和客户端实例
- BZOJ 2795: [Poi2012]A Horrible Poem( hash )
- VC++ 动态创建单个工具条,并加载外部的位图(bmp)文件为工具栏图像
- jquery 实现点击其他地方隐藏之前点击显示的div标签等
- UITextField使用步骤
- TrafficStats——流量统计类的范例,获取实时网速
- hdu 5385 The path 2015多校联合训练赛#8 bfs
- android 简单的登录
- 一个"2-SUM"问题
- Python中文件读取readlines()方法
- 如何统计全天各个时间段产品销量情况(sqlserver)
- 安装redis3.0.3
- 活动目录架构主机转移操作
- redis安装部署
- 如何为你的代码选择一个开源协议
- BZOJ 题目1208: [HNOI2004]宠物收养所(SBT)
- 4-连接,8-连接,m-连接的概念和关系
- Mac 实用工具
- iOS学习之AutoLayout常用方法