Computer Virus on Planet Pandora

Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 256000/128000 K (Java/Others)
Total Submission(s): 4090    Accepted Submission(s): 1072

Problem Description
    Aliens on planet Pandora also write computer programs like us. Their programs only consist of capital letters (‘A’ to ‘Z’) which they learned from the Earth. On 
planet Pandora, hackers make computer virus, so they also have anti-virus software. Of course they learned virus scanning algorithm from the Earth. Every virus has a pattern string which consists of only capital letters. If a virus’s pattern string is a substring of a program, or the pattern string is a substring of the reverse of that program, they can say the program is infected by that virus. Give you a program and a list of virus pattern strings, please write a program to figure out how many viruses the program is infected by.

 
Input
There are multiple test cases. The first line in the input is an integer T ( T<= 10) indicating the number of test cases.

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
For each test case, print an integer K in a line meaning that the program is infected by K viruses.

 
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

In the second case in the sample input, the reverse of the program is ‘GHIFEDCCBA’, and ‘GHI’ is a substring of the reverse, so the program is infected
by virus ‘GHI’.

题目链接:HDU 3695

比较裸的一道题目,拿来熟练默写一下自动机模版还行,主串转换完记得清空数组或者在结尾加上'\0',不然若小于上一次留下来的主串长度则会跟上一次的连在一起造成WA,坑了好久…………

代码:

#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
typedef pair<int,int> pii;
typedef long long LL;
const double PI=acos(-1.0);
const int N=1010;
const int M=5100010;
struct Aho
{
struct Trie
{
int nxt[26];
int cnt,fail;
inline void reset()
{
CLR(nxt,0);
cnt=fail=0;
}
};
Trie L[260*N];
int tot; void init()
{
L[0].reset();
tot=1;
} void insert(char s[])
{
int len=strlen(s);
int now=0;
for (int i=0; i<len; ++i)
{
int indx=s[i]-'A';
if(!L[now].nxt[indx])
{
L[tot].reset();
L[now].nxt[indx]=tot++;
}
now=L[now].nxt[indx];
}
++L[now].cnt;
} void build()
{
L[0].fail=-1;
queue<int>Q;
Q.push(0);
while (!Q.empty())
{
int now=Q.front();
Q.pop();
for (int i=0; i<26; ++i)
{
if(!L[now].nxt[i])
continue;
if(!now)
L[L[now].nxt[i]].fail=0;
else
{
int v=L[now].fail;
while (~v)
{
if(L[v].nxt[i])
{
L[L[now].nxt[i]].fail=L[v].nxt[i];
break;
}
v=L[v].fail;
}
if(v==-1)
L[L[now].nxt[i]].fail=0;
}
Q.push(L[now].nxt[i]);
}
}
} int cal(int now)
{
int r=0;
while (now)
{
r+=L[now].cnt;
L[now].cnt=0;
now=L[now].fail;
}
return r;
}
int solve(char s[])
{
int len=strlen(s);
int now=0;
int ret=0;
for (int i=0; i<len; ++i)
{
int indx=s[i]-'A';
if(L[now].nxt[indx])
now=L[now].nxt[indx];
else
{
int p=L[now].fail;
while (~p&&!L[p].nxt[indx])
p=L[p].fail;
if(p==-1)
now=0;
else
now=L[p].nxt[indx];
}
if(L[now].cnt)
ret+=cal(now);
}
return ret;
}
};
Aho aho;
char s[N],temp[M],tar[M]; int main(void)
{
int tcase,n,i;
scanf("%d",&tcase);
while (tcase--)
{
CLR(tar,0);//就是这里要清空一下
aho.init();
scanf("%d",&n);
for (i=0; i<n; ++i)
{
scanf("%s",s);
aho.insert(s);
}
aho.build();
scanf("%s",temp);
int len=strlen(temp);
int cnt=0;
for (i=0; i<len; ++i)
{
if(temp[i]>='A'&&temp[i]<='Z')
tar[cnt++]=temp[i];
else
{
++i;
int C=0;
while (temp[i]<'A'||temp[i]>'Z')
{
C=C*10+(temp[i]-'0');
++i;
}
char c=temp[i];
while (C--)
tar[cnt++]=c;
++i;
}
}
int ans=0;
ans+=aho.solve(tar);
reverse(tar,tar+cnt);
ans+=aho.solve(tar);
printf("%d\n",ans);
}
return 0;
}

HDU 3695 Computer Virus on Planet Pandora(AC自动机模版题)的更多相关文章

  1. hdu ----3695 Computer Virus on Planet Pandora (ac自动机)

    Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 256000/1280 ...

  2. hdu 3695 Computer Virus on Planet Pandora(AC自己主动机)

    题目连接:hdu 3695 Computer Virus on Planet Pandora 题目大意:给定一些病毒串,要求推断说给定串中包括几个病毒串,包括反转. 解题思路:将给定的字符串展开,然后 ...

  3. hdu 3695:Computer Virus on Planet Pandora(AC自动机,入门题)

    Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 256000/1280 ...

  4. AC自动机 - 多模式串的匹配 --- HDU 3695 Computer Virus on Planet Pandora

    Problem's Link Mean: 有n个模式串和一篇文章,统计有多少模式串在文章中出现(正反统计两次). analyse: 好久没写AC自动机了,回顾一下AC自动机的知识. 本题在构造文章的时 ...

  5. HDU 3695 Computer Virus on Planet Pandora (AC自己主动机)

    题意:有n种病毒序列(字符串),一个模式串,问这个字符串包括几种病毒. 包括相反的病毒也算.字符串中[qx]表示有q个x字符.具体见案列. 0 < q <= 5,000,000尽然不会超, ...

  6. HDU3695 - Computer Virus on Planet Pandora(AC自动机)

    题目大意 给定一个文本串T,然后给定n个模式串,问有多少个模式串在文本串中出现,正反都可以 题解 建立好自动机后.把文本串T正反各匹配一次,刚开始一直TLE...后面找到原因是重复的子串很多以及有模式 ...

  7. POJ 3987 Computer Virus on Planet Pandora (AC自动机优化)

    题意 问一个字符串中包含多少种模式串,该字符串的反向串包含也算. 思路 解析一下字符串,简单. 建自动机的时候,通过fail指针建立trie图.这样跑图的时候不再跳fail指针,相当于就是放弃了fai ...

  8. 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 ...

  9. HDU 3695 / POJ 3987 Computer Virus on Planet Pandora

      Computer Virus on Planet Pandora Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1353 ...

随机推荐

  1. DOM--4 响应用户操作和事件(2)

    自定义事件 //旧的方法 //创建 var event = document.createEvent('Event'); //初始化 event.initEvent('build', true, tr ...

  2. 20145223《Java程序程序设计》第3周学习总结

    20145223 <Java程序设计>第3周学习总结 教材学习内容总结 第四章内容 1.类与对象 如何定义一个包含有几个值域(Field成员)就是需要我们定义一个类(Class),书上给的 ...

  3. 1140 分珠 dfs

    时间限制:500MS  内存限制:65536K提交次数:24 通过次数:18 题型: 编程题   语言: G++;GCC Description 如下图所示,有若干珠子,每颗珠子重量不同,珠子之间有一 ...

  4. KMP(fail数组应用) LA 3026 Period

    题目传送门 题意:(训练指南P213) 求每个前缀的最短循环节 分析:利用失配函数的性质,如果i % (i - fail[i]) == 0,那么正好错位移动一个循环节长度. #include < ...

  5. Backbone.js学习之一

    昨天一个我崇拜的朋友,徐飞送我一本名为<Backbone.js实战>书,让我心中狂喜,于是带着这份浓厚的兴趣,开始研究Backbone.js之路. 打开这本书的第一句话就很有哲理,“授人以 ...

  6. 【Infomatica】Infomatica PowerCenter 9.1.0配置Repository Service和Integration Service小结

    2014-05-14 今天在虚拟机中尝试安装Infomatica PowerCenter 9.1.0. 安装环境:Windows Server 2003 32bit. 字符集环境 DBMS:Oracl ...

  7. BZOJ3692 : 愚蠢的算法

    两个函数相同等价于不存在长度为$3$的下降子序列. 先考虑随意填的部分,设$f[i][j]$表示考虑了$[i,n]$,下降子序列第$2$项的最小值的是这里面第$j$个的方案数,转移则考虑往序列里插数字 ...

  8. 【BZOJ3631】松树的新家 树链剖分

    BZOJ3631 松树的新家 Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...

  9. 内网配置DNS服务器,无域名,只有主机名

    Hadoop集群中,使用DNS而不是hosts来访问服务器. 1. 安装bind软件 用root用户运行: yum -y install bind* 2. 配置named.conf文件 vi /etc ...

  10. http 上传文件

    @RequestMapping(method=RequestMethod.POST,value = "/upload") public ModelAndView processIm ...