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. jQuery-表格以及表单

    表单应用: 1.设置高度: $comment.height($comment.height() + 50); $comment.animate({height : "+=50"}, ...

  2. 优先队列 UVA 11997 K Smallest Sums

    题目传送门 题意:训练指南P189 分析:完全参考书上的思路,k^k的表弄成有序表: 表1:A1 + B1 <= A1 + B2 <= .... A1 + Bk 表2:A2 + B1 &l ...

  3. POJ3469 Dual Core CPU(最小割)

    形象生动的最小割.. #include<cstdio> #include<cstring> #include<queue> #include<algorith ...

  4. 每天一个linux命令--su

    su命令和su -命令最大的本质区别就是:前者只是切换了root身份,但Shell环境仍然是普通用户的Shell:而后者连用户和Shell环境一起切换成root身份了. [richmail@porta ...

  5. Leetcode Maximum Depth of Binary Tree

    Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...

  6. 【FZU】1977 Pandora adventure

    http://acm.fzu.edu.cn/problem.php?pid=1977 题意:n×m的网格,有3种格子,'O'必须经过.'*'可以选择经过.'X'不能经过.现在要求路径经过所有'O'且是 ...

  7. 【Oracle】同义词问题

    优点: 1.节省数据库空间,多用户可以操作同一张表: 2.扩展的数据库的使用范围,能够在不同的数据库用户之间实现无缝交互: 3.利用Database Link.创建同义词可以实现不同数据库服务器之间的 ...

  8. 20145330第十周《Java学习笔记》

    20145330第十周<Java学习笔记> 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就 ...

  9. 复制 VS 复用 -04

    (续上篇)         小菜:“我明白了,他说用任意一种面向对象语言实现,那意思就是要用面向对象的编程方法去实现,对吗?OK,这个我学过,只不过当时我没想到而已.” 大鸟:“所有编程初学者都会有这 ...

  10. php by oneself

    在php里面写html代码真的很麻烦,最近学到了一个新的方法: <html> <head> <title>PHP</title> <meta ht ...