HDU 3695 / POJ 3987 Computer Virus on Planet Pandora
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 1353 | Accepted: 256 |
Description
Input
For each test case:
The first line is a integer n( 0 < n <= 250) indicating the number of virus pattern strings.
Then n lines follows, each represents a virus pattern string. Every pattern string stands for a virus. It’s guaranteed that those n pattern strings are all different so there are n different viruses. The length of pattern string is no more than 1,000 and a pattern string at least consists of one letter.
The last line of a test case is the program. The program may be described in a compressed format. A compressed program consists of capital letters and “compressors”. A “compressor” is in the following format:
[qx]
q is a number( 0 < q <= 5,000,000)and x is a capital letter. It means q consecutive letter xs in the original uncompressed program. For example, [6K] means ‘KKKKKK’ in the original program. So, if a compressed program is like:
AB[2D]E[7K]G
It actually is ABDDEKKKKKKKG after decompressed to original format.
The length of the program is at least 1 and at most 5,100,000, no matter in the compressed format or after it is decompressed to original format.
Output
Sample Input
3 2 AB DCB DACB 3 ABC CDE GHI ABCCDEFIHG 4 ABB ACDEE BBB FEEE A[2B]CD[4E]F
Sample Output
0 3 2
Hint
Source
给你T组测试数据,每组测试数据有n个模式串,后面跟着一个母串,你需要输出母串包含模式串的个数。(反着也算;不计重复串)
【分析】:
模式串构建fail树
母串正着跑一遍匹配,反着跑一遍。(这样既可以降低空间复杂度,又可以提高运行速度)
- Source Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define Sz 26
#define m(s) memset(s,0,sizeof s);
using namespace std;
const int N=5e5+5,Z=26,F=5.1e6+5;
int T,n,m,l,ans,cnt=1,tr[N][Z],fail[N],tag[N],q[N];
bool mark[N];char str[F],s[F];
//===============================================
inline void insert(){
int now=1;
for(int i=0,z;i<l;i++){
z=s[i]-'A';
if(!tr[now][z]) tr[now][z]=++cnt;
now=tr[now][z];
}
tag[now]++;
}
inline void acmach(){
for(int i=0;i<Sz;i++) tr[0][i]=1;
int h=0,t=1,now,p;q[t]=1;fail[1]=0;
while(h!=t){
now=q[++h];
for(int i=0;i<Sz;i++){
if(!tr[now][i]) continue;
p=fail[now];
while(!tr[p][i]) p=fail[p];
p=tr[p][i];
fail[tr[now][i]]=p;
q[++t]=tr[now][i];
}
}
}
inline void solve(){
int now=1;l=strlen(s);
for(int z,i=0;i<l;i++){
z=s[i]-'A';
mark[now]=1;
while(!tr[now][z]) now=fail[now];
now=tr[now][z];
if(!mark[now]){
for(int j=now;j;j=fail[j]){
if(tag[j]){
ans+=tag[j];
tag[j]=0;
}
}
}
}
}
//===============Aho Corasick Automata===============
inline int translate(){
int j=0,x=0;
for(int i=0;str[i];i++){
if((str[i]>='A'&&str[i]<='Z')
||(str[i]>='a'&&str[i]<='z')){
s[j++]=str[i];
}
if(str[i]>='0'&&str[i]<='9'){
x=x*10+str[i]-'0';
}
if(str[i]==']'){
while(--x) s[j++]=str[i-1];
}
}
s[j]=0;
return j;
}
inline void Clear(){
ans=0;cnt=1;
m(tr);m(tag);m(fail);m(mark);
}
int main(){
scanf("%d",&T);
while(T--){
Clear();
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s",s);l=strlen(s);
insert();
// reverse(s,s+l);
// insert();
}
acmach();
scanf("%s",str);
l=translate();
solve();
reverse(s,s+l);
solve();
printf("%d\n",ans);
}
return 0;
}
HDU 3695 / POJ 3987 Computer Virus on Planet Pandora的更多相关文章
- HDU 3695 / POJ 3987 Computer Virus on Planet Pandora(AC自动机)(2010 Asia Fuzhou Regional Contest)
Description Aliens on planet Pandora also write computer programs like us. Their programs only consi ...
- POJ 3987 Computer Virus on Planet Pandora (AC自动机优化)
题意 问一个字符串中包含多少种模式串,该字符串的反向串包含也算. 思路 解析一下字符串,简单. 建自动机的时候,通过fail指针建立trie图.这样跑图的时候不再跳fail指针,相当于就是放弃了fai ...
- hdu 3695:Computer Virus on Planet Pandora(AC自动机,入门题)
Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 256000/1280 ...
- HDU 3695 Computer Virus on Planet Pandora(AC自动机模版题)
Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 256000/1280 ...
- hdu 3695 Computer Virus on Planet Pandora(AC自己主动机)
题目连接:hdu 3695 Computer Virus on Planet Pandora 题目大意:给定一些病毒串,要求推断说给定串中包括几个病毒串,包括反转. 解题思路:将给定的字符串展开,然后 ...
- hdu 3695 10 福州 现场 F - Computer Virus on Planet Pandora 暴力 ac自动机 难度:1
F - Computer Virus on Planet Pandora Time Limit:2000MS Memory Limit:128000KB 64bit IO Format ...
- hdu ----3695 Computer Virus on Planet Pandora (ac自动机)
Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 256000/1280 ...
- HDU-3695 Computer Virus on Planet Pandora
HDU-3695 Computer Virus on Planet Pandora 题意:电脑中病毒了, 现在n钟病毒指令, 然后有一个电脑指令, 看一下这个电脑指令中了几个病毒, 如果电脑种了某一个 ...
- HDU 3695 Computer Virus on Planet Pandora (AC自己主动机)
题意:有n种病毒序列(字符串),一个模式串,问这个字符串包括几种病毒. 包括相反的病毒也算.字符串中[qx]表示有q个x字符.具体见案列. 0 < q <= 5,000,000尽然不会超, ...
随机推荐
- java集合框架01——总体框架一览
java集合框架是java提供的工具包,在java.util.*中,这个包中包含了常用的数据结构:集合.数组.链表.栈.队列.映射等.java集合框架主要可以分为四个部分:List列表.Set集合.M ...
- oracle事务块示例
begin Insert into T_SYS_PAGEOPER (FOPERID,FPAGEID) values (152,22); Insert into T_SYS_PAGEOPER (FOPE ...
- swiper动态加载数据滑动失效,ajax执行后swiper.js的效果消失问题
使用swiper.js做一些动效时,如果进行了ajax,并且重新把DOM写入到HTML代码中,会导致swiper.js的特效消失的问题.原因是ajax加载后,原先new 的Swiper对象,不认识新来 ...
- UINavigationController 返回按钮去掉文字
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetric ...
- memcache基础知识-stats参数
安装memcache: #tar -xvf libevent-1.4.13-stable.tar.gz#cd libevent-1.4.13-stable#./configure && ...
- window下安装Node.js NPM
一.安装Node.js 下载地址:http://nodejs.org/download/ 1..msi文件,直接安装,包括了npm,结束. 2..exe文件,把node.exe所在主目录,加入到系统P ...
- size_t详细解释
在学习sizeof运算符的时候,它的值类型为size_t,结果在使用printf函数显示的时候,凭空多了很多警告,有点不不理解,为啥搞这么复杂?直接用个int类型多省事? 经过一番搜索和阅读文档,找到 ...
- [svc][op]杀进程
杀进程: 杀服务名 /usr/bin/killall -HUP syslogd 杀掉进程号 /bin/kill -USR1 $(cat /var/run/nginx.pid 2>/dev/nul ...
- 新型I/O架构引领存储之变(二)
新型I/O架构引领存储之变(二) 作者:廖恒 众所周知,支持存储及网络I/O服务的接口协议有很多种.比方,以太网及Infiniband接口都支持採用iSCSI协议来实现存储业务,它们也因而成为了ser ...
- nyoj 460 项链 (区间dp)
项链 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子, ...