hdu 3065 AC自动机 标记数组不清零
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=3065
题目里面要我们计算每种单词出现的次数,重叠的也要计算,那么我们在查找的时候不要把标记单词结尾的数组(我这里是val)清零就可以重复计算每个单词出现的数量了。
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<vector>
#include<set>
#include<cstdio>
#include<string>
#include<deque>
using namespace std;
typedef long long LL;
#define eps 1e-8
#define INF 0x3f3f3f3f
#define maxn 50005
int trie[maxn][],fail[maxn],val[maxn],ID[maxn],num[maxn];
int n,m,k,t,cnt;
char s[][],str[];
void init(){
memset(trie,,sizeof(trie));
memset(fail,,sizeof(fail));
memset(val,,sizeof(val));
memset(num,,sizeof(num));
cnt=;
}
void insert(char *s,int id){
int root=;
for(int i=;s[i];i++){
int x=s[i]-;
if(trie[root][x]==)
trie[root][x]=++cnt;
root=trie[root][x];
}
val[root]++;
ID[root]=id;//记录编号
}
void build_fail(){//构建fail指针
queue<int>q;
int root=;
for(int i=;i<;i++){
if(trie[root][i])
q.push(trie[root][i]);
}
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=;i<;i++){
if(trie[u][i]){//u存在儿子i,把i的fail指向fail[u]的儿子i
fail[trie[u][i]]=trie[fail[u]][i];
q.push(trie[u][i]);
}else{//不存在儿子i
trie[u][i]=trie[fail[u]][i];//让fail[u]的儿子i成为u的儿子
}
}
}
}
void query(){
int len=strlen(str);
int u=;
for(int i=;i<len;i++){
int id=str[i]-;
u=trie[u][id];
int temp=u;
while(temp){
if(val[temp]){//找到一个以id+32这个字符结束的单词,我们在这里不把它的标记数组val清零
num[ID[temp]]++;
}
temp=fail[temp];
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF){
init();
for(int i=;i<=n;i++){
scanf("%s",s[i]);
insert(s[i],i);
}
build_fail();
scanf("%s",str);
query();
for(int i=;i<=n;i++){
if(num[i]){
printf("%s: ",s[i]);
printf("%d\n",num[i]);
}
}
}
return ;
}
hdu 3065 AC自动机 标记数组不清零的更多相关文章
- hdu 3065 AC自动机(各子串出现的次数)
病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- hdu 3065 AC自动机
// hdu 3065 AC自动机 // // 题目大意: // // 给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次 // // 解题思路: // // AC自动机,插入,构建, ...
- HDU 3065 (AC自动机模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 题目大意:多个模式串,范围是大写字母.匹配串的字符范围是(0~127).问匹配串中含有哪几种模 ...
- 病毒侵袭持续中 HDU - 3065 AC自动机
小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的"万恶之源".这是一个庞大的病毒网站,他有着好多好多的病毒,但是这个网站包含的病毒 ...
- HDU 3065 AC自动机 裸题
中文题题意不再赘述 注意 失配数组 f 初始化一步到位 #include <stdio.h> #include <string.h> #include <queue&g ...
- hdu 3065 AC自动机模版题
题意:输出每个模式串出现的次数,查询的时候呢使用一个数组进行记录就好. 同上题一样的关键点,其他没什么难度了. #include <cstdio> #include <cstring ...
- hdu 5880 AC自动机
Family View Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- hdu 2825 aC自动机+状压dp
Wireless Password Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- hdu 2896 AC自动机
// hdu 2896 AC自动机 // // 题目大意: // // 给你n个短串,然后给你q串长字符串,要求每个长字符串中 // 是否出现短串,出现的短串各是什么 // // 解题思路: // / ...
随机推荐
- xamarin android 开发
开始环境vs2017 直接创建android 项目,左边是android studio 的项目目录 右边是vs创建的android 项目目录 结构基本相同,有res对应的Resources文件 加载 ...
- UIView和CALayer区别
(1)首先UIView可以响应用户的触摸事件,Layer不可以. (2)View中frame getter方法,bounds和center,UIView并没有做什么工作:它只是简单的各自调用它底层的C ...
- servlet-response学习笔记
为了给用户一个返回数据,我们需要使用HttpServletResponse 从相应对象获取一个输入流 通过输入流将返回结果写入到响应体中 关闭输入流 public class ResponseServ ...
- docker 命令汇集
1,查看容器 docker ps [-a] #-a表示全全部否者仅显示运行的 2,登录容器 docker exec -it [containerId] /bin/bashdocker exec -it ...
- (转)SQLServer分区表操作
原文地址:https://www.cnblogs.com/libingql/p/4087598.html 1. 分区表简介 分区表在逻辑上是一个表,而物理上是多个表.从用户角度来看,分区表和普通表是一 ...
- GNU C和C99标准中的可变参数宏(variadic macros)
用可变参数宏(variadic macros)传递可变参数表你可能很熟悉在函数中使用可变参数表,如: void printf(const char* format, …); 直到最近,可变参数表还是只 ...
- 部署GlusterFS及Heketi
一.前言及环境 在实践kubernetes的StateFulSet及各种需要持久存储的组件和功能时,通常会用到pv的动态供给,这就需要用到支持此类功能的存储系统了.在各类支持pv动态供给的存储系统中, ...
- IDEA overwrite报错、languagelevel设置不生效问题
发现idea 倒入项目后,发现@override报错,发现是idea的jdk版本不对,需要设置大于1.5的jdk版本 解决办法: IDEA:File >> Project Structur ...
- js实现选中div内容并复制到剪切板
function copyUrl () { var div = document.getElementById('xxxx'); if (document.body.createTextRange) ...
- centos mysql 默认是区分大小写的,修改成不区分大小写
修改mysql为不区分大小写设置: [root@test-huanqiu ~]# vim /etc/my.cnf //添加下面一行设置 .... [mysqld] lower_case_table_n ...