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. 决策树模型组合之(在线)随机森林与GBDT

    前言: 决策树这种算法有着很多良好的特性,比如说训练时间复杂度较低,预测的过程比较快速,模型容易展示(容易将得到的决策树做成图片展示出来)等.但是同时, 单决策树又有一些不好的地方,比如说容易over ...

  2. JAVA线程池ThreadPoolExecutor-转

    首先是构造函数签名如下: public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeU ...

  3. android 各国语言对应的缩写

    android资源文件夹的写法规则: 语言缩写-国家地区缩写 语言缩写 藏语:bo_CN en 英文 en_US 英文 (美国) ar 阿拉伯文 ar_AE 阿拉伯文 (阿拉伯联合酋长国) ar_BH ...

  4. [mysql] Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'loser.tank_admin.login_ip' which is not functionally dependent on columns in GROUP BY clause; this is

    执行SQL: SELECT login_name,login_ip,sex FROM tank_admin GROUP BY login_name ; 时抛出异常. Expression #2 of ...

  5. 10socket编程

    这一节主要关注的还是粘包问题,我们利用recv实现一个recv_peek函数,它的目的是偷窥目的,它是利用recv的一个msg_peek参数与read的区别,read读取后 会擦除缓冲区的内容,而re ...

  6. 异步I/O编程实例,异步socket

    下载地址: http://files.cnblogs.com/badnewfish/RUYEESocket.rar ———————————————————————————————————————— 举 ...

  7. 剑指offer系列35----序列化二叉树

    [题目] * 请实现两个函数,分别用来序列化和反序列化二叉树 * 1 / \ 2 3 /\ /\4 5 6 7 * * 序列化的结果是1,2,#,#,3,4,#,7,#,#,5,#,#,. * 而反序 ...

  8. C#调用MySql

    1.要连接MySql数据库必须首先下载MySql官方的连接.net的文件,文件下载地址为http://dev.mysql.com/downloads/connector/net/6.6.html#do ...

  9. Android中使用am命令实现在命令行启动程序详解

    在Android中,除了从界面上启动程序之外,还可以从命令行启动程序,使用的是命令行工具am. 复制代码代码如下: usage: am [subcommand] [options] start an ...

  10. 程序包com.sun.image.codec.jpeg不存在 问题的完美解决

    原文地址:http://my.oschina.net/zb0423/blog/86507 在使用Hudson进行打包的过程中,因为我们使用了一个pdf文件产生缩略图的功能,倒置添加的源码文件在mave ...