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 题目大意:有多个文本,多个模式串.问每个模式串中,有多少个文本?(匹配可重复) 解题思路: 传统 ...
随机推荐
- Jfinal中log4j的配置
基本不用配置: 1.web.xml不用配置: 2.添加文件log4j.properties到src下面: 3.lib中复制log4j的jar包进去: 4.可以使用了; package demo; im ...
- android 为应用程序创建桌面快捷方式技巧分享
手机装的软件过多,找起来很不方便,所以在主页面有一个快捷方式的话会很不错的,本文将介绍如何实现,需要了解跟多的朋友可以参考下 我们开发一款软件后,如果手机装的软件过多,去翻的话会很难翻的,所以 ...
- JABX简单介绍
主要引至http://suo.iteye.com/blog/1233458 一.简介 1.概念是什么:(Java Architecture for XML Binding) 是一个业界的标准,是一项可 ...
- PEM文件格式详细解析
PEM文件格式存档 Author:Roson sun sunxiao@tomonline-inc.com Time:2006-4-11 1. 描述: Openssl使用PEM(RFC 1421-14 ...
- 【python】浅谈for...else...语句
for循环可以和 else 子句同时使用(for...else).当迭代完for循环完整个列表失败后,会执行else语句.但循环中被 break 终止的情况下不会执行.如下例子所示: for i in ...
- Linux下nl命令的用法详解
Linux中nl命令和cat命令很像,不过nl命令会打上行号,属于比较不常用的命令,下面随小编一起来了解下这个鲜为人知的nl命令吧. nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文 ...
- 嵌入式设计模式:有限状态自动机的C语言实现
转自:http://www.cnblogs.com/autosar/archive/2012/06/22/2558604.html 状态机模式是一种行为模式,在<设计模式>这本书中对其有详 ...
- Redis数据库?-Redis的Virtual Memory介绍(转)
众所周知,Redis是一个内存数据库,和Memcached类似,所有数据存在内存中,当然,Redis有rdb和appendonlyfile两个落地文件,可以对断电停机等故障下的数据恢复做一些保证.但是 ...
- Flash AS 响应双击事件MouseEvent.DOUBLE_CLICK
没想到在WinForm简简单单的一个问题,在AS里会成为一个坑. 我遇到的这个问题是由于Loader没有设置doubleClickEnabled=true而导致的. 因此出现这个问题,请思考是否由于此 ...
- codeforces 55D - Beautiful numbers(数位DP+离散化)
D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...