(AC自动机)C - 病毒侵袭持续中
题目链接:https://cn.vjudge.net/contest/280743#problem/C
题目大意:中文题
具体思路:首先取ascii码0-130是肯定不行的了,会超时。然后就开始简化,如果是按照0-30来的话,会出现负值,这个时候我们就可以单独对每个合法的子串求符合他的子串。
注意:
1,不能一次把所有合法的子串一起搞,比如这个样例 aa-..aaa,如果把所有合法的搞在一起的话,会变成 aaaaa,这样合法情况就会变多了,所以对每个子串分别求就可以了。
2,每一次截取的时候,我们可以在这个字符串的尾部加上一个 ‘\0'(字符串结束符),这样的话,就可以按照子串进行了。
AC代码:
#include<iostream>
#include<stack>
#include<stdio.h>
#include<cstring>
#include<string>
#include<map>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
# define ll long long
const int maxn = 5e4+;
const int maxm = 1e6+;
char str1[+][],str2[+],tmp[+];
int tot,ch[maxn][],val[maxn];
int fail[maxn],last[maxn],vis[maxn];
void add(int t)
{
int p=;
int len=strlen(str1[t]);
for(int i=; i<len; i++)
{
int u=str1[t][i]-'A';
if(!ch[p][u])
ch[p][u]=++tot;
p=ch[p][u];
}
val[p]=t;
}
void getfail()
{
queue<int>q;
for(int i=; i<; i++)
{
if(ch[][i])
q.push(ch[][i]);
}
while(!q.empty())
{
int top=q.front();
q.pop();
for(int i=; i<; i++)
{
int u=ch[top][i];
if(u==)
continue;
q.push(u);
int v=fail[top];
while(v&&ch[v][i]==)
v=fail[v];
fail[u]=ch[v][i];
last[u]=val[fail[u]] ? fail[u] : last[fail[u]];
}
}
}
void cal(int t)
{
while(t)
{
vis[val[t]]++;
// val[t]=0;
t=last[t];
}
}
void getans()
{
int len=strlen(tmp);
int p=;
for(int i=; i<len; i++)
{
int u=tmp[i]-'A';
while(p&&ch[p][u]==)
p=fail[p];
p=ch[p][u];
if(val[p])
cal(p);
else if(fail[p])
cal(fail[p]);
}
}
void init()
{
memset(ch,,sizeof(ch));
memset(val,,sizeof(val));
memset(fail,,sizeof(fail));
memset(last,,sizeof(last));
memset(vis,,sizeof(vis));
tot=;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
init();
for(int i=; i<=n; i++)
{
scanf("%s",str1[i]);
add(i);
}
getfail();
scanf("%s",str2);
int p=;
int len=strlen(str2); for(int i=; i<=len; i++)//注意这个地方结束条件是等于,这样的话就可以不用讨论最后一个字符串是合法的但是需要特殊对待的。
{
if(str2[i]>='A'&&str2[i]<='Z')
{
tmp[p++]=str2[i];
}
else
{
tmp[p]='\0';
getans();
p=;
}
}
for(int i=; i<=n; i++)
{
if(vis[i]==)
continue;
printf("%s: %d\n",str1[i],vis[i]);
}
}
return ;
}
(AC自动机)C - 病毒侵袭持续中的更多相关文章
- AC自动机---病毒侵袭持续中
HDU 3065 题目网址: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110773#problem/C Description 小t ...
- 【HDU3065】 病毒侵袭持续中(AC自动机)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- hdu3065 病毒侵袭持续中 AC自动机入门题 N(N <= 1000)个长度不大于50的模式串(保证所有的模式串都不相同), 一个长度不大于2000000的待匹配串,求模式串在待匹配串中的出现次数。
/** 题目:hdu3065 病毒侵袭持续中 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意:N(N <= 1000)个长度不大于50的 ...
- hdu 3065 病毒侵袭持续中【AC自动机】
<题目链接> 题目大意: 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的“万恶之源”.这是一个庞大的病毒网站,他有着好多好多的病毒,但是 ...
- hdu3065 病毒侵袭持续中【AC自动机】
病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU3065 病毒侵袭持续中 —— AC自动机
题目链接:https://vjudge.net/problem/HDU-3065 病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- 病毒侵袭持续中 HDU - 3065 AC自动机
小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的"万恶之源".这是一个庞大的病毒网站,他有着好多好多的病毒,但是这个网站包含的病毒 ...
- hdu----(3065)病毒侵袭持续中(AC自动机)
病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU 3065 病毒侵袭持续中 (AC自动机)
题目链接 Problem Description 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的"万恶之源".这是一个庞大的病毒 ...
- HDU-3065 病毒侵袭持续中 AC自动机又是一板子!
病毒侵袭持续中 上一题是求出现多少病毒输出病毒序号,而这题输出每个病毒出现的次数.这题有字典树基础都能做出来,把叶子节点用相应的编号标记起来,匹配的时候遍历到叶子节点用一个数组把次数存起来就行了. 有 ...
随机推荐
- akm
队名--牛肉面不要牛肉不要面 队伍成员 211406285 林志松 [队长兼前端开发] 211606368 林书浩 [系统设计] 211606357 陈远军 [UI美工] 211606335 吴沂章 ...
- js分页实例
js分页实例 案例1 1.js_pageusers.html <!DOCTYPE html> <html> <head> <title>js_pageu ...
- UIView 添加闪烁的渐变光
CGRect gradientRect=CGRectMake(- imageView3.bounds.size.width*, * imageView3.bounds.size.width, imag ...
- 获得用户的真实IP地址
/** * 获得用户的真实IP地址 * * @access public * @return string */if (!function_exists('get_real_ip')){ functi ...
- Python的文件读写
目录 读文件 操作文件 读取内容 面试题的例子 写文件 操作模式 指针操作 字符编码 读文件 操作文件 打开一个文件用open()方法(open()返回一个文件对象,它是可迭代的): 文件使用完毕后必 ...
- 2019 front-end web trending
2019 front-end web trending https://github.com/kamranahmedse/developer-roadmap https://raw.githubuse ...
- Linux_Crontab命令
一.Crontab 字段名称 说明 范围 分钟 每小时中的第几分钟执行 0~59 小时 每日的第几小时执行 0~23 日期 每月的第几天执行 1~31 月历 每年的第几月执行 1~12 星期 每周的第 ...
- 51nod 1494 选举拉票 (线段树+扫描线)
1494 选举拉票 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 现在你要竞选一个县的县长.你去对每一个选民进 ...
- c++11 decltype
c++11 decltype decltype实际上有点像auto的反函数,auto可以让你声明一个变量,而decltype则可以从一个变量或表达式中得到类型.decltype在C++11标准制定时引 ...
- KUR-Couriers
题目链接: QwQ Solution: 以权值为下标,对每个点建树 对于x点,以它为根的树涵盖的是1到x区间内每个数出现的次数 Code: #include<bits/stdc++.h> ...