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

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

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的更多相关文章

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

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

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

  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. HDU 3695 Computer Virus on Planet Pandora(AC自动机模版题)

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

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

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

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

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

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

  8. HDU-3695 Computer Virus on Planet Pandora

    HDU-3695 Computer Virus on Planet Pandora 题意:电脑中病毒了, 现在n钟病毒指令, 然后有一个电脑指令, 看一下这个电脑指令中了几个病毒, 如果电脑种了某一个 ...

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

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

随机推荐

  1. hibernate的配置, 增删改查

    路径:查找路径 实际上都是查找编译后的对应的路径,在bin文件夹中总 增删改必须开启事务才行 hibernate加载文件的两种方式 configure 1.引包 antlr-2.7.6.jar bac ...

  2. Latex排版:CTeX winEdit 输出“系统找不到指定的文件”的解决办法)

    winEdit输出“系统找不到指定的文件”,这里“指定的文件”是“TeXify.exe”等需要运行的程序,而不是当前需要编译的“.tex”文件.所以,问题的本质就是系统找不到“TeXify.exe”等 ...

  3. Windows Azure Platform 性能监视器(转载)

    Windows操作系统提供了查看性能监视器的功能,用于监视CPU使用率.内存使用率,硬盘读写速度,网络速度等.您可以在开始-->运行-->输入Perfmon,就可以打开性能监视器. 我们知 ...

  4. 在同一台服务器上启动多个 FreeSWITCH 实例

    有时候,需要用到多个FreeSWITCH进行测试,或者需要在一台服务器上部署多个“不兼容”的系统.我们在这一节探讨一下怎么做. 背景故事 几年前我还在Idapted工作的时候,由于需要连接Skype及 ...

  5. unity, 不要试图用rigidbody.Sleep()停止rigidbody

    如果想让rigidbody pause,用rigidbody.Sleep()是完全错误的办法.因为有很多情况都可能使一个处在sleep的rigidbody唤醒,所以调用rigidbody.Sleep( ...

  6. socket 통신

    00.C# --> Application.ThreadException --> Application.Run --> Container --> Application. ...

  7. atitit.md5算法的原理 与 总结

    atitit.md5算法的原理 与 总结 1. MD5的位数 128位1 2. 字节数组转换为32位字符串 base161 2.1. 十六进制字符用4个二进制位来表示1 2.2. byte[]和十六进 ...

  8. git commit 、CHANGELOG 和版本发布的标准自动化

    一直以来,因为团队项目迭代节奏很快,每次发布的更新日志和版本更新都是通过人肉来完成的.有时候实在忙的团团转,对于手动的写这些更新信息就显得力不从心了.对于团队新来的小伙伴,有时候遇到些紧急情况,就更显 ...

  9. 140726暑期培训.txt

    1.   输入多组数据的时候       while(scanf("%s",s)!=EOF)       while(gets(s)!=NULL)     用gets和scanf不 ...

  10. [搬运]CORBA中BOA和POA的含义

    先来BOA,搬自:http://www.cl.cam.ac.uk/research/dtg/attarchive/omniORB/doc/2.8/omniORB2/node6.html The Bas ...