码迷,mamicode.com
首页 > Web开发 > 详细

HDU-3695 Computer Virus on Planet Pandora

时间:2018-04-07 22:48:34      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:put   正向匹配   trie   type   lap   bsp   i++   signed   分享图片   

HDU-3695 Computer Virus on Planet Pandora

题意:电脑中病毒了, 现在n钟病毒指令, 然后有一个电脑指令, 看一下这个电脑指令中了几个病毒, 如果电脑种了某一个病毒, 那么就有子串是病毒指令, 或者 子串的反串是病毒指令, 现在问电脑指令一共感染了多少病毒。

题解:AC自动机,然后正向匹配一遍, 反向匹配一遍。

代码:

技术分享图片
  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define LL long long
  4 #define ULL unsigned LL
  5 #define fi first
  6 #define se second
  7 #define lson l,m,rt<<1
  8 #define rson m+1,r,rt<<1|1
  9 #define max3(a,b,c) max(a,max(b,c))
 10 #define min3(a,b,c) min(a,min(b,c))
 11 const int INF = 0x3f3f3f3f;
 12 const LL mod = 1e9+7;
 13 typedef pair<int,int> pll;
 14 const int N = 1e6+10;
 15 int tot = 2;
 16 char str[N*26], tmp[N*26];
 17 int trie[N*4][26], cnt[N*26], fair[N*26];
 18 void init(){
 19     for(int i = 1; i < tot; i++){
 20         for(int j = 0; j < 26; j++)
 21             trie[i][j] = 0;
 22     }
 23     tot = 2;
 24 }
 25 void Insert(){
 26     int rt = 1, len = strlen(str);
 27     for(int i = 0; i < len; i++){
 28         int id = str[i] - A;
 29         if(!trie[rt][id]) {
 30             cnt[tot] = 0;
 31             fair[tot] = 0;
 32             trie[rt][id] = tot++;
 33         }
 34         rt = trie[rt][id];
 35     }
 36     cnt[rt]++;
 37 }
 38 void Build_tree(){
 39     queue<int> q;
 40     q.push(1);
 41     int p;
 42     while(!q.empty()){
 43         int tmp = q.front();
 44         q.pop();
 45         for(int j = 0; j < 26; j++){
 46             if(trie[tmp][j]){
 47                 if(tmp == 1)
 48                     fair[trie[tmp][j]] = 1;
 49                 else {
 50                     p = fair[tmp];
 51                     while(p){
 52                         if(trie[p][j]){
 53                             fair[trie[tmp][j]] = trie[p][j];
 54                             break;
 55                         }
 56                         else p = fair[p];
 57                     }
 58                     if(!p) fair[trie[tmp][j]] = 1;
 59                 }
 60                 q.push(trie[tmp][j]);
 61             }
 62         }
 63     }
 64 }
 65 int Find(int len){
 66     int ret = 0, rt = 1;
 67     for(int i = 0; i < len; i++){
 68         int id = str[i] - A;
 69         while(rt !=  1 && !trie[rt][id]) rt = fair[rt];;
 70         if(trie[rt][id]) rt = trie[rt][id];
 71         int p = rt;
 72         while(p != 1){
 73             if(cnt[p] >= 0){
 74                 ret += cnt[p];
 75                 cnt[p] = -1;
 76             }
 77             else break;
 78             p = fair[p];
 79         }
 80     }
 81     rt = 1;
 82     for(int i = len - 1; i >= 0; i--){
 83         int id = str[i] - A;
 84         while(rt !=  1 && !trie[rt][id]) rt = fair[rt];
 85         if(trie[rt][id]) rt = trie[rt][id];
 86         int p = rt;
 87         while(p != 1){
 88             if(cnt[p] >= 0){
 89                 ret += cnt[p];
 90                 cnt[p] = -1;
 91             }
 92             else break;
 93             p = fair[p];
 94         }
 95     }
 96     return ret;
 97 }
 98 int main(){
 99     int t;
100     scanf("%d", &t);
101     while(t--){
102         int n;
103         init();
104         scanf("%d", &n);
105         while(n--){
106             scanf("%s", str);
107             Insert();
108         }
109         Build_tree();
110         scanf("%s", tmp);
111         int len = strlen(tmp);
112         int ccc = 0;
113         for(int i = 0; i < len; i++){
114             if(tmp[i] != [){
115                 str[ccc++] = tmp[i];
116             }
117             else {
118                 int _c = 0;
119                 i++;
120                 while(isdigit(tmp[i]))
121                     _c = _c *10 + (int)(tmp[i]-0), i++;
122                 while(_c--)
123                     str[ccc++] = tmp[i];
124                 i++;
125             }
126         }
127         printf("%d\n", Find(ccc));
128     }
129     return 0;
130 }
View Code

 

HDU-3695 Computer Virus on Planet Pandora

标签:put   正向匹配   trie   type   lap   bsp   i++   signed   分享图片   

原文地址:https://www.cnblogs.com/MingSD/p/8734772.html

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