hdu-Danganronpa(AC自动机)
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).
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).
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
n
lines, each line contains a integer describing the total damage of
Ai
from all m
bullets, ∑mj=1f(Ai,Bj).
1
5 6
orz
sto
kirigiri
danganronpa
ooooo
o
kyouko
dangan
ronpa
ooooo
ooooo
1
1
0
3
7
最简单的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自动机)的更多相关文章
- hdu 2896 AC自动机
// hdu 2896 AC自动机 // // 题目大意: // // 给你n个短串,然后给你q串长字符串,要求每个长字符串中 // 是否出现短串,出现的短串各是什么 // // 解题思路: // / ...
- hdu 3065 AC自动机
// hdu 3065 AC自动机 // // 题目大意: // // 给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次 // // 解题思路: // // AC自动机,插入,构建, ...
- hdu 5880 AC自动机
Family View Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- hdu 2296 aC自动机+dp(得到价值最大的字符串)
Ring Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu 2825 aC自动机+状压dp
Wireless Password Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- hdu 3065 AC自动机(各子串出现的次数)
病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- Hdu 5384 Danganronpa (AC自动机模板)
题目链接: Hdu 5384 Danganronpa 题目描述: 给出n个目标串Ai,m个模式串Bj,问每个目标串中m个模式串出现的次数总和为多少? 解题思路: 与Hdu 2222 Keywords ...
- HDU 5384 AC自动机
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5384 题意:给n个母串,给m个匹配串,求每个母串依次和匹配串匹配,能得到的数目和. 分析:之前并不知道AC ...
- HDU 2222 AC自动机模板题
题目: http://acm.hdu.edu.cn/showproblem.php?pid=2222 AC自动机模板题 我现在对AC自动机的理解还一般,就贴一下我参考学习的两篇博客的链接: http: ...
- HDU 2846 (AC自动机+多文本匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2846 题目大意:有多个文本,多个模式串.问每个模式串中,有多少个文本?(匹配可重复) 解题思路: 传统 ...
随机推荐
- sklearn小知识
特征缩放:# 为了追求机器学习和最优化算法的最佳性能,我们将特征缩放 from sklearn.preprocessing import StandardScaler sc = StandardSca ...
- maven 常见错误解决
1. maven打包编译时后台一直输出警告信息 [WARNING] File encoding has not been set, using platform encoding GBK, i.e. ...
- xshell 5连接linux服务器的技巧
1.用sttp 方式连接服务器,命令识别不了,用ssh方式才能有效
- MySQL 利用SQL线程对Binlog操作(转)
背景: 对于MySQL的binlog的查看都是用其自带的工具mysqlbinlog进行操作的,其实还有另一个方法来操作binlog,就是Replication中的SQL线程去操作binlog,其实bi ...
- js调用ajax
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- PHP使用1个crontab管理多个crontab任务
http://www.binarytides.com/php-manage-multiple-cronjobs-with-a-single-crontab-entry/ In many php app ...
- C# WinForm开发系列 - ComboBox
5.一个带CheckBox,分组,颜色标记等功能的下拉框 PowerComboBoxCSharp.rar 包含自动完成下拉框,字体下拉框,电脑盘符,多列下拉框,带CheckBox,树型下拉框等.代码 ...
- .NET_RSA加密全接触(重、难点解析)
.NET_RSA加密全接触(重.难点解析) .NET Framework提供了两个类供我们使用RSA算法,分别是:用于加密数据的RSACryptoServiceProvider和用于数字签名的DSAC ...
- 【Executor】配置ThreadPoolExecutor
来自为知笔记(Wiz) 附件列表
- 51nod 1314 定位系统
一个国家有N个城市(标号为0~N-1),这N个城市恰好由N-1条道路连接在一起(即N个城市正好构成一个树状结构).这个国家的所有道路的长度都是1个长度单位.定义:两个城市间的距离是两个城市间的最短路的 ...