题目链接:

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自动机 标记数组不清零的更多相关文章

  1. hdu 3065 AC自动机(各子串出现的次数)

    病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  2. hdu 3065 AC自动机

    // hdu 3065 AC自动机 // // 题目大意: // // 给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次 // // 解题思路: // // AC自动机,插入,构建, ...

  3. HDU 3065 (AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 题目大意:多个模式串,范围是大写字母.匹配串的字符范围是(0~127).问匹配串中含有哪几种模 ...

  4. 病毒侵袭持续中 HDU - 3065 AC自动机

    小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的"万恶之源".这是一个庞大的病毒网站,他有着好多好多的病毒,但是这个网站包含的病毒 ...

  5. HDU 3065 AC自动机 裸题

    中文题题意不再赘述 注意 失配数组 f  初始化一步到位 #include <stdio.h> #include <string.h> #include <queue&g ...

  6. hdu 3065 AC自动机模版题

    题意:输出每个模式串出现的次数,查询的时候呢使用一个数组进行记录就好. 同上题一样的关键点,其他没什么难度了. #include <cstdio> #include <cstring ...

  7. hdu 5880 AC自动机

    Family View Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  8. hdu 2825 aC自动机+状压dp

    Wireless Password Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  9. hdu 2896 AC自动机

    // hdu 2896 AC自动机 // // 题目大意: // // 给你n个短串,然后给你q串长字符串,要求每个长字符串中 // 是否出现短串,出现的短串各是什么 // // 解题思路: // / ...

随机推荐

  1. Elasticsearch-6.7.0系列(二)ES集群安装与验证

    准备3台centos7机器/虚拟机,每台都安装上elasticsearch6.7.0 ,安装过程参考我的另一篇博客<Elasticsearch-6.7.0系列(一)9200端口 .tar.gz版 ...

  2. C++常用数据结构-CString

    CString类Str.format(_T(“%d”),number)例子: str.Format(_T("%d"),number);%c 单个字符(char)%d 十进制整数(i ...

  3. 如何让SQLServer的 itemNum 字段 按照数字大小顺序排序

    我的 itemNum 从1到20,可是超过了SQLServer的默认排序这样的1101112...19234567如何才能让排序成为这样1234567891011.. . 解决办法:因为 itemNu ...

  4. Java笔记Spring(八)

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  5. js实现输入某串数字,构建完全二叉树,并判断是否为二叉搜索树

    思路:若为二叉搜索树,则中序遍历为递增的 let arr = [15,8,16,6,10];let pindex = [];function Node(){ this.root = null; thi ...

  6. 4-linux、hdfs命令

    定义: linux:Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的 操作系统.它能运行主要的UNIX工具软件.应用程序和 ...

  7. Linux中docker的使用

    # 列出当前所有正在运行的容器$ docker ps # 列出所有的容器$ docker ps -a # 列出最近一次启动的容器$ docker ps -l # 查看容器的相关信息$ docker i ...

  8. [java,2019-01-28] 枪手博弈,谁才是最后赢家

    什么是枪手博弈: 枪手博弈指彼此痛恨的甲乙丙三个枪手准备决斗.甲枪法最好,十发八中.乙枪法次之,十发六中.丙枪法最差,十发四中.假设他们了解彼此实力,也能做出理性判断. 问题一:如果三人同时开枪,并且 ...

  9. GIT教程的好文章

    Git 教學(1):Git的基本使用 Git 教學(2):Git Branch 的操作與基本工作流程 Git 情境劇:告訴你使用 Git 時什麼情況該下什麼指令

  10. IntelliJ IDEA 工程Java文件上红色的无效符

    IntelliJ IDEA 工程Java文件上红色的无效符(红色表示该类是不可编译文件) 1.查看Java.resources文件夹 如图所示,是因为没有配置 2.在Java文件夹点击右键找到Mark ...