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;
}

最新文章

  1. MyEclipse相关部署问题
  2. 【Java EE 学习 51】【Spring学习第三天】【cglib动态代理】【AOP和动态代理】【切入点表达式】
  3. ab压力测试
  4. 微信小程序-视图
  5. MySql 执行语句错误 Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near
  6. iOS 利用CoreLocation和MapKit开发搜索附近的商场功能
  7. tesseract3.02识别验证码需要注意的问题
  8. 20150625_Andriod_01_ListView1_条目选中
  9. Java TCP异步数据接收
  10. android代码片段二
  11. JSP-注释,脚本元素,指令
  12. Django runserver show client ip
  13. Java——单例设计模式
  14. mysql 索引相关
  15. Android查缺补漏--Service和IntentService
  16. Linux磁盘使用过载
  17. 【转】手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)
  18. CentOS7_防火墙
  19. ORA-12638:Credential retrieval failed(身份证明检索失败)解决方法
  20. 安装指定版本的nodejs

热门文章

  1. Android 6.0删除Apache HttpClient相关类的解决方法
  2. 搜索关注点--2014年的google关注点
  3. 【svn】 SVN错误:Attempted to lock an already-locked dir
  4. Spring boot配合Spring session(redis)遇到的错误
  5. 给Jquery动态添加的元素添加事件2
  6. Android 检测网络连接状态
  7. [转]StringUtils方法
  8. CSS position, z-index
  9. 剑指offer系列59---寻找丑数
  10. bzoj4316: 小C的独立集