zoukankan      html  css  js  c++  java
  • ZOJ3430 Detect the Virus AC自动机

    题意:给你base64编码后的模式串和文本串,让你看编码之前的文本串和分别包含了多少模式串

    解题思路:主要是编码还有注意分支要开256 ,然后就是裸的AC自动机

    解题代码:

      1 // File Name: temp.cpp
      2 // Author: darkdream
      3 // Created Time: 2014年09月11日 星期四 15时18分256秒
      4 
      5 #include<vector>
      6 #include<list>
      7 #include<map>
      8 #include<set>
      9 #include<deque>
     10 #include<stack>
     11 #include<bitset>
     12 #include<algorithm>
     13 #include<functional>
     14 #include<numeric>
     15 #include<utility>
     16 #include<sstream>
     17 #include<iostream>
     18 #include<iomanip>
     19 #include<cstdio>
     20 #include<cmath>
     21 #include<cstdlib>
     22 #include<cstring>
     23 #include<ctime>
     24 #include<queue>
     25 #define LL long long
     26 #define maxn 512*65
     27 using namespace std;
     28 int hs[515];
     29 struct Trie
     30 {
     31     int next[maxn][256],fail[maxn],end[maxn];
     32     int root, L;
     33     int newnode()
     34     {
     35         memset(next[L],-1,sizeof(next[L]));
     36         end[L++] = 0 ;
     37         return L-1;
     38     }
     39     void init()
     40     {
     41         L = 0 ; 
     42         root = newnode();
     43     }
     44     void insert(int buf[],int len,int K)
     45     {
     46         int now = root;
     47         for(int i = 0 ;i < len ;i ++)
     48         {
     49             if(next[now][buf[i]] ==  -1)
     50             {
     51                 next[now][buf[i]] = newnode();
     52             }
     53             now = next[now][buf[i]];
     54         }
     55         end[now] = K;
     56     }
     57     void build()
     58     {
     59         queue<int> Q;
     60         fail[root] = root; 
     61         for(int i = 0;i < 256;i ++)
     62         {
     63             if(next[root][i] == -1)
     64             {
     65                 next[root][i] = root;  //指向root 是没有问题的,我们主要是通过end 数组对个数进行计数的。    
     66             }else{
     67                 fail[next[root][i]] = root;
     68                 Q.push(next[root][i]);
     69             }
     70         }
     71         while(!Q.empty())
     72         {
     73             int now = Q.front();
     74             Q.pop();
     75             for(int i = 0 ;i < 256;i ++)
     76             {
     77                 if(next[now][i] == -1)
     78                     next[now][i] =  next[fail[now]][i]; 
     79                 else{
     80                     fail[next[now][i]] = next[fail[now]][i];
     81                     Q.push(next[now][i]);
     82                 }
     83             }
     84         }
     85     }
     86     void query(int buf[],int len)
     87     {
     88         int now = root ; 
     89         for(int  i = 0 ;i < len;i ++)
     90         {
     91             now = next[now][buf[i]];
     92             int temp = now ; 
     93             while(temp != root)
     94             {
     95                 if(end[temp])
     96                 {
     97                     hs[end[temp]] = 1;
     98                 }
     99                 temp = fail[temp];
    100             }
    101         }
    102     }
    103 };
    104 char buf[3058];
    105 int  temp[3058];
    106 Trie ac;
    107 int cbit(char c)
    108 {
    109     if(c >= 'A' && c <= 'Z') 
    110         return c -'A';
    111     if(c >= 'a' && c <= 'z')
    112         return c -'a' + 26;
    113     if(c >= '0' && c <= 'z')
    114         return c -'0' + 52;
    115     if(c == '+')
    116         return 62;
    117     else if(c == '/')return 63;
    118 }
    119 void debug(int x)
    120 {
    121     printf("%d
    ",x);
    122     for(int  i = 0 ;i < x; i ++)
    123         printf("%c",temp[i]);
    124     printf("
    ");
    125 }
    126 int lt = 0;
    127 void change(){
    128 
    129     int len = strlen(buf);
    130     int t = 0;  
    131     int ln = 0 ;
    132     int tt;
    133     lt = 0;
    134     for(int i = 0 ;i < len;i ++)
    135     {
    136         if(buf[i] != '=') 
    137         {
    138             if(buf[i] >= 'A' && buf[i] <= 'Z') 
    139                 tt =  buf[i] -'A';
    140             else if(buf[i] >= 'a' && buf[i] <= 'z')
    141                 tt = buf[i]-'a' + 26;
    142             else if(buf[i] >= '0' && buf[i] <= 'z')
    143                 tt= buf[i] -'0' + 52;
    144             else if(buf[i] == '+')
    145                 tt = 62;
    146             else if(buf[i] == '/')tt = 63;
    147             if(6 < 8 - t)
    148             {
    149                 ln += (tt << (8-t-6));
    150                 t += 6;
    151             }else{
    152                 ln += (tt >> (6-8+t));
    153                 temp[lt++] = ln;
    154                 ln = (tt&((1<<(6-8+t)) -1)) << (8-(6-8+t));
    155                 t = (6-8+t);
    156             }
    157         }
    158     }
    159     //printf("%d %d
    ",lt,rlen);
    160 }
    161 
    162 int main(){
    163     int n;
    164     while(scanf("%d",&n) != EOF)
    165     {
    166         ac.init();
    167         for(int i =1 ;i <= n;i ++)
    168         {
    169             scanf("%s",buf);
    170             change();
    171             ac.insert(temp,lt,i); 
    172             // debug(lt);
    173         }
    174         ac.build();
    175         int m; 
    176         scanf("%d",&m);
    177         for(int i = 1;i <= m;i ++)
    178         {
    179             memset(hs,0,sizeof(hs));
    180             scanf("%s",buf);
    181             change();
    182             // debug(lt);
    183             int ans = 0; 
    184             ac.query(temp,lt);
    185             for(int i = 1;i <= n;i ++)
    186                 if(hs[i])
    187                 {
    188                     ans ++ ;
    189                 }
    190             printf("%d
    ",ans);
    191         }
    192         printf("
    ");
    193     }
    194     return 0;
    195 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    出现灾难性Bug:Vista RTM跳票内幕曝光
    微软官方反间谍流氓软件WindowsDefender
    在Windows上玩转Mono/Linux
    使用信息架构视图访问数据库元数据
    BPM 与 SOA的演进与展望
    使用Microsoft® .NET Framework 3.0 and Visual Studio® 2005开发的免费课程
    bootstrap源码学习与示例:bootstrapdropdown
    bootstrap源码学习与示例:bootstrapalert
    我的MVVM框架 v3教程——todos例子
    我的MVVM框架 v3教程——类名切换
  • 原文地址:https://www.cnblogs.com/zyue/p/3973142.html
Copyright © 2011-2022 走看看