码迷,mamicode.com
首页 > 其他好文 > 详细

ZOJ3430 Detect the Virus AC自动机

时间:2014-09-15 17:25:19      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   for   2014   

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

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

解题代码:

bubuko.com,布布扣
  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\n",x);
122     for(int  i = 0 ;i < x; i ++)
123         printf("%c",temp[i]);
124     printf("\n");
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\n",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\n",ans);
191         }
192         printf("\n");
193     }
194     return 0;
195 }
View Code

 

ZOJ3430 Detect the Virus AC自动机

标签:style   blog   http   color   io   os   ar   for   2014   

原文地址:http://www.cnblogs.com/zyue/p/3973142.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!