Problem Description
Danganronpa is a video game franchise created and developed by Spike Chunsoft, the series' name is compounded from the Japanese words for "bullet" (dangan) and "refutation" (ronpa).



Now, Stilwell is playing this game. There are n
verbal evidences, and Stilwell has m
"bullets". Stilwell will use these bullets to shoot every verbal evidence.



Verbal evidences will be described as some strings
Ai,
and bullets are some strings Bj.
The damage to verbal evidence Ai
from the bullet Bj
is f(Ai,Bj).

f(A,B)=∑i=1|A|−|B|+1[ A[i...i+|B|−1]=B ]

In other words, f(A,B)
is equal to the times that string B
appears as a substring in string A.

For example: f(ababa,ab)=2,
f(ccccc,cc)=4



Stilwell wants to calculate the total damage of each verbal evidence
Ai
after shooting all m
bullets Bj,
in other words is ∑mj=1f(Ai,Bj).

 
Input
The first line of the input contains a single number
T,
the number of test cases.

For each test case, the first line contains two integers
n,
m.

Next n
lines, each line contains a string Ai,
describing a verbal evidence.

Next m
lines, each line contains a string Bj,
describing a bullet.



T≤10

For each test case, n,m≤105,
1≤|Ai|,|Bj|≤104,
∑|Ai|≤105,
∑|Bj|≤105

For all test case, ∑|Ai|≤6∗105,
∑|Bj|≤6∗105,
Ai
and Bj
consist of only lowercase English letters
 
Output
For each test case, output
n
lines, each line contains a integer describing the total damage of
Ai
from all m
bullets, ∑mj=1f(Ai,Bj).
 
Sample Input
1
5 6
orz
sto
kirigiri
danganronpa
ooooo
o
kyouko
dangan
ronpa
ooooo
ooooo
 
Sample Output
1
1
0
3
7
 
wange2014   |   We have carefully selected several similar problems for you:  5421 5420 5419 5418 5417





最简单的AC自动机题型,关于AC自动机详解见:http://blog.csdn.net/niushuai666/article/details/7002823 
http://www.cppblog.com/menjitianya/archive/2014/07/10/207604.html

#include<cstdio>
#include<cmath>
#include<stdlib.h>
#include<map>
#include<set>
#include<time.h>
#include<vector>
#include<queue>
#include<string>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define LL long long
#define rd(a) scanf("%d",&a)
#define rdLL(a) scanf("%I64d",&a)
#define rdd(a,b) scanf("%d%d",&a,&b)
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
typedef pair<int , int> P;
#define MOD 1000000007
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,1,sizeof(a))
#define Max 500010 struct Trie{
int next[Max][26],fail[Max],end[Max];
int root,L; int newnode()
{
memset(next[L],-1,sizeof(next[L])); ///初始化根节点没有一个子节点
end[L++]=0;
return L-1;
} void init()
{
L=0;
root = newnode();
} void insert(char buf[]) ///建树
{
int len = strlen(buf) , 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'];
}
end[now]++;
} void build() ///bfs建立fail指针
{
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]; ///失败的指针指向该子节点父亲节点fail位置的第i个孩子
Q.push( next[now][i] );
}
}
}
int query (char buf[]) ///当前字符串中有哪些部分在树中
{
int len = strlen(buf) , now = root , sum = 0;
for(int i=0 ; i<len ; i++)
{
now = next[now][buf[i]-'a']; int temp = now;
while( temp != root )
{
sum += end[temp];
///end[temp] = 0 ; ///查看出现过读多少串
temp = fail[temp];
}
}
return sum;
}
}; char buf[Max*2];
Trie ac; int main()
{
int T;
int n,m;
scanf("%d",&T);
while(T--)
{
string str[100005];
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++){
cin>>str[i];
}
ac.init();
for(int i=0 ; i<n ; i++)
{
scanf("%s",buf);
ac.insert(buf);
}
ac.build();
for(int i = 0 ; i<m ; i++){
strcpy(buf, str[i].c_str() );
printf("%d\n",ac.query(buf));
}
}
return 0;
}

hdu-Danganronpa(AC自动机)的更多相关文章

  1. hdu 2896 AC自动机

    // hdu 2896 AC自动机 // // 题目大意: // // 给你n个短串,然后给你q串长字符串,要求每个长字符串中 // 是否出现短串,出现的短串各是什么 // // 解题思路: // / ...

  2. hdu 3065 AC自动机

    // hdu 3065 AC自动机 // // 题目大意: // // 给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次 // // 解题思路: // // AC自动机,插入,构建, ...

  3. hdu 5880 AC自动机

    Family View Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  4. hdu 2296 aC自动机+dp(得到价值最大的字符串)

    Ring Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. hdu 2825 aC自动机+状压dp

    Wireless Password Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  6. hdu 3065 AC自动机(各子串出现的次数)

    病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  7. Hdu 5384 Danganronpa (AC自动机模板)

    题目链接: Hdu 5384 Danganronpa 题目描述: 给出n个目标串Ai,m个模式串Bj,问每个目标串中m个模式串出现的次数总和为多少? 解题思路: 与Hdu 2222  Keywords ...

  8. HDU 5384 AC自动机

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5384 题意:给n个母串,给m个匹配串,求每个母串依次和匹配串匹配,能得到的数目和. 分析:之前并不知道AC ...

  9. HDU 2222 AC自动机模板题

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=2222 AC自动机模板题 我现在对AC自动机的理解还一般,就贴一下我参考学习的两篇博客的链接: http: ...

  10. HDU 2846 (AC自动机+多文本匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2846 题目大意:有多个文本,多个模式串.问每个模式串中,有多少个文本?(匹配可重复) 解题思路: 传统 ...

随机推荐

  1. Android ActionBarSherlock使用教程

    Android ActionBarSherlock使用教程 本文转自 http://www.chenwg.com/android/actionbarsherlock%E4%BD%BF%E7%94%A8 ...

  2. Ajax请求在IE和Google Chrome中可以响应,在Firefox中无法响应

    在工作中碰到这么一个问题,发送ajax请求,在IE和chrome中可以正常的响应,但是在Firefox中无法响应,代码如下: JS代码: function Sure(obj) { var statu ...

  3. 设计师必看的10个HTML5动画工具

    如果你想用令人难以置信的动画创建引人注目的网站的话,那么这里为设计师精心挑选了一些必备的HTML5动画工具.HTML5是设计师用来打造时尚网站的最流行的编程语言之一.在过去三年内,这种编程语言的使用人 ...

  4. 【linux】rpm常见命令

    查看包依赖模块:http://www.rpmfind.net/ rpm  -ivh [包名] :安装rpm包 rpm  -e [包名] :删除rpm包 rpm  -aq [包名] :查询rpm包 rp ...

  5. 03 在Linux下安装Myeclipse及Tomcat(含下载)

    测试环境: 主机系统:Win 7 虚拟机:VMware workstation 11.1.0 虚拟机OS: centos 6.5 64位 Kernel 2.6.32-431-e16.x86_64 My ...

  6. 【jdbcTemplate】使用jdbcTemplate查询的三种回调

    用于查询的回调接口定义主要有以下三种: org.springframework.jdbc.core.ResultSetExtractor.  基本上属于JdbcTemplate内部使用的Callbac ...

  7. php正则替换所有空格和换行

    替换所有空格为空 $contents=" abc "; $contents=preg_replace('/\s+/','',$contents); //结果$contents=&q ...

  8. c++封装编写线程池

    在csapp学习或者其他linux底层编程的过程中,一般都会举一些多线程或多进程的例子,配合底层同步原语.系统调用api来解释怎么创建多线程/多进程. 但是这些例子和实际项目中所用到的多线程/多进程编 ...

  9. 如何配置apache最大的并发数

    如何配置apache最大的并发数MPM(多路处理模块)常见:1.perfork 预处理进程方式2.worker 工作者模式3.winnt 在windows使用 案例:把apache的最大并发数配置成1 ...

  10. Maven本地安装JAR包组件

    http://www.mkyong.com/maven/how-to-add-oracle-jdbc-driver-in-your-maven-local-repository/ mvn instal ...