题意:问你主串有几种模式串。但是所有串都是加密的,先解码。解码过程为:先把串按照他给的映射表变成6位数二进制数,然后首尾衔接变成二进制长串,再8位8位取变成新的数,不够的补0。因为最多可能到255,所以不能用char存,要用int。

思路:模拟乱搞一下,加个板子完事。

代码:

#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include <iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 550 * 64 + 10;
const int M = maxn * 30;
const ull seed = 131;
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
char s[maxn];
int bit[maxn * 8], now[maxn * 8];
map<int, int> change;
void init(){change.clear();for(int i = 0; i <= 25; i++)change['A' + i] = i;for(int i = 26; i <= 51; i++)change['a' + i - 26] = i;for(int i = 52; i <= 61; i++)change['0' + i - 52] = i;change['+'] = 62;change['/'] = 63;
}
int sp(){int len = strlen(s);int num = 0;for(int i = 0; i < len; i++){if(s[i] == '='){num -= 2;continue;}int k = change[s[i]];for(int j = 5; j >= 0; j--){bit[num++] = ((k & (1 << j)) == 0? 0 : 1);}}int cnt = 0;for(int i = 0; i < num; i += 8){now[cnt] = 0;for(int j = i; j <= i + 7; j++){now[cnt] = now[cnt] * 2 + bit[j];}cnt++;}return cnt;
}struct Aho{struct state{int next[260];int fail, cnt;}node[maxn];int size;queue<int> q;void init(){size = 0;newtrie();while(!q.empty()) q.pop();}int newtrie(){memset(node[size].next, 0, sizeof(node[size].next));node[size].cnt = node[size].fail = 0;return size++;}void insert(int s[], int len, int id){int now = 0;for(int i = 0; i < len; i++){int c = s[i];if(node[now].next[c] == 0){node[now].next[c] = newtrie();}now = node[now].next[c];}node[now].cnt = id;}void build(){node[0].fail = -1;q.push(0);while(!q.empty()){int u = q.front();q.pop();for(int i = 0; i < 260; i++){if(node[u].next[i]){if(u == 0) node[node[u].next[i]].fail = 0;else{int v = node[u].fail;while(v != -1){if(node[v].next[i]){node[node[u].next[i]].fail = node[v].next[i];break;}v = node[v].fail;}if(v == -1) node[node[u].next[i]].fail = 0;}q.push(node[u].next[i]);}}}}set<int> res;void get(int u){ //匹配规则while(u){if(node[u].cnt) res.insert(node[u].cnt);u = node[u].fail;}}int match(int s[], int len){res.clear();int ret = 0, now = 0;for(int i = 0; i < len; i++){int c = s[i];if(node[now].next[c]){now = node[now].next[c];}else{int p = node[now].fail;while(p != -1 && node[p].next[c] == 0){p = node[p].fail;}if(p == -1) now = 0;else now = node[p].next[c];}get(now);}return res.size();}
}ac;
int main(){init();int n;while(~scanf("%d", &n)){ac.init();for(int i = 1; i <= n; i++){scanf("%s", s);int len = sp();ac.insert(now, len, i);}ac.build();int m;scanf("%d", &m);while(m--){scanf("%s", s);int len = sp();printf("%d\n", ac.match(now, len));}printf("\n");}return 0;
}

转载于:https://www.cnblogs.com/KirinSB/p/11176943.html

ZOJ 3430 Detect the Virus(AC自动机 + 模拟)题解相关推荐

  1. ZOJ 3430 Detect the Virus 【AC自动机+解码】

    解码的那些事儿,不多说. 注意解码后的结果各种情况都有,用整数数组存储,char数组会超char类型的范围(这个事最蛋疼的啊)建立自动机的时候不能用0来判断结束. #include <cstdi ...

  2. ZOJ - 3228 Searching the String(AC自动机求不重复子串出现次数)

    题目链接:点击查看 题目大意:给出一个匹配串 str ,再给出 n 个长度不大于 6 的匹配串 s ,问每个匹配串出现的次数,分可以重复或不可以重复两种情况 题目分析:因为是匹配串在模式串中出现的次数 ...

  3. HDU 3065 病毒侵袭持续中(AC自动机)题解

    题意:要你找到主串中每个模式串的个数. 思路:题目都没说是多组数据,结果没while(~)直接WA了,和上一题差不多,可以用map或者开个数组储存.指针要记得回收内存,不然MLE. #include& ...

  4. 转自kuangbin的AC自动机(赛前最后一博)

    有了KMP和Trie的基础,就可以学习神奇的AC自动机了.AC自动机其实就是在Trie树上实现KMP,可以完成多模式串的匹配.           AC自动机 其实 就是创建了一个状态的转移图,思想很 ...

  5. 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组

    题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能 ...

  6. ZOJ 3228 Searching the String (AC自动机)

    题意: 给你一个模板串, 和n 个要匹配的串, 匹配串有两种类型, 第一种 可以在模板串中 重叠 出现, 另一种不可以重叠, 问每个串的两种形式 所出现的数量. 思路: 很明显ac自动机. 我们先把所 ...

  7. ZOJ 3228(AC自动机+修改的匹配)

    题目大意:给出一个字符串和若干个单词,问这些单词在字符串里面出现了多少次.单词前面为0表示这个单词可重叠出现,1为不可重叠出现. 分析:可重叠出现的单词可以直接用ac自动机就解决.至于不可重叠的单词, ...

  8. AC自动机 - 多模式串的匹配 --- HDU 3695 Computer Virus on Planet Pandora

    Problem's Link Mean: 有n个模式串和一篇文章,统计有多少模式串在文章中出现(正反统计两次). analyse: 好久没写AC自动机了,回顾一下AC自动机的知识. 本题在构造文章的时 ...

  9. 【GDOI2017第三轮模拟day2】魔法咒语(AC自动机,矩阵乘法)

    Description Solution 这道题目的60分非常的简单,直接用ac自动机直接搞一搞就好了. 但是后面的40分怎么做? 我们发现后面的40分全部都是基本单词长度不会大于2,所以我们可以考虑 ...

  10. 【jzoj5078】【GDOI2017第三轮模拟day2】【魔法咒语】【ac自动机】【矩阵快速幂】

    题目大意 解题思路 对非法串构ac自动机,对于l较小的情况,设f[i][j]表示长度为i,在ac自动机上j点的方案数,直接dp即可. 对于加入串len<=2的情况,对于每个j拆成两个点矩阵快速幂 ...

最新文章

  1. [Openwrt 项目开发笔记]:Samba服务vsFTP服务(四)
  2. 图画hadoop -- 生态圈
  3. 【ASP.NET开发】ASP.NET(MVC)三层架构知识的学习总结
  4. 使用EL表达式接收url的传值
  5. Linux vim编辑器常用命令
  6. 计算机网络(二十七)-IPv4
  7. linux系统下find命令的使用
  8. postman:Could not get any response解决方法
  9. html5数字在线处理,Qunee for HTML5 - 中文 : 事件处理
  10. AlphaGo Zero算法讲解
  11. php抛物线函数,通过JS如何实现抛物线运动(详细教程)
  12. calfcamel的2333(java)
  13. 【永磁同步电机转速环ADRC电流环ADRC双环无传感器控制】
  14. 针孔相机(小孔成像)的原理(opencv之手眼标定--1)
  15. 医学杂识-脑电数据-TRC文件解读分析
  16. 企业邮箱注册流程解析:分享如何申请注册企业邮箱
  17. PowerBuilder 进度条
  18. amd建议超频吗_amd建议超频吗_科普|聊聊AMD新品和最近热议的“老批次CPU”超频问题...
  19. 【转】算法总结,素数判断
  20. 334个地级市名单_334个地级市名单_334个地级市的“基层”演出,李志说“如果我死了,得留下点什么”......

热门文章

  1. 说说vue-cli中使用flexible和px2rem-loader
  2. 小视频app开发过程中关于转码问题的经验总结
  3. 进程管理之工作管理详解(job control)
  4. 探究JVM——运行时数据区
  5. 6月第二周国内域名解析商Top10:万网份额突破21%
  6. 运行IIS提示500.21错误
  7. 给.net初学者的一些建议(共勉之)
  8. Spring中原型prototype
  9. 用SecureCRT连接采用NAT方式上网的虚拟机
  10. python2和python3的编码区别