[kuangbin带你飞]专题17:D
来源:互联网 发布:java 运行时获取注解 编辑:程序博客网 时间:2024/05/21 13:50
原题
AC自动机模版 + base64的解码
wa1 : 同个匹配串内多次出现的病毒只记录一次。
wa2 : 范围为256的部分特殊字符char的强制类型转换有问题(不确定)
解决:得到ascll码的int数组, 把int型数组作为匹配串直接去匹配
#include<iostream>#include<stack>#include<queue>#include<string>#include<cstring>#include<cstdio>#include<vector>using namespace std;const int MAXN = 50010;int map(char c) { if(c >= 'A' && c <= 'Z') return c - 'A'; else if(c >= 'a' && c <= 'z') return c - 'a' + 26; else if(c >= '0' && c <= '9') return c - '0' + 52; else if(c == '+') return 62; else return 63;}int ascll[MAXN];int change(string s) { //init queue<int> q; memset(ascll, 0, sizeof(ascll)); int l = (int)s.length(); for(int i = 0; i < l && s[i] != '='; i++) { int temp = map(s[i]); for(int i = 5; i >= 0; i--) q.push(temp>>i & 1); } int k = 0; while(q.size() >= 8) {//8个一取,小于8时即代表剩下的都是添加的0 for(int i = 7; i >= 0; i--) { if(q.front()) ascll[k] += 1<<i; q.pop(); } k++; } ascll[k] = -1; return k;}int node[MAXN][256], fail[MAXN], End[MAXN];int root, L;bool vis[MAXN];int newnode() { for(int i = 0; i < 256; i++) node[L][i] = -1; fail[L] = -1; End[L] = 0; L++; return L-1;}void init() { L = 0; root = newnode();}void insert(int l) { int now = root; for(int i = 0; i < l; i++) { int id = ascll[i]; if(node[now][id] == -1) node[now][id] = newnode(); now = node[now][id]; } End[now]++;}void setfail() { queue<int> q; q.push(root); while(!q.empty()) { int now = q.front(); q.pop(); for(int i = 0 ; i < 256; i++) if(node[now][i] != -1) { int pre = fail[now]; while(pre != -1 && node[pre][i] == -1) pre = fail[pre]; fail[node[now][i]] = pre == -1 ? root : node[pre][i]; q.push(node[now][i]); } }}int query(int l) { int now = root; int cnt = 0; for(int i = 0; i < l; i++) { int id = ascll[i]; while(now != -1 && node[now][id] == -1) now = fail[now]; now = now == -1 ? root : node[now][id]; for(int p = now; p != -1; p = fail[p]) if(End[p] && !vis[p]) { cnt += End[p]; vis[p] = true; } } return cnt;}int main() { freopen("a.in", "r", stdin); ios::sync_with_stdio(false); int n; string s; while(cin >> n) { init(); for(int i = 1; i <= n; i++) { cin >> s; insert(change(s)); } setfail(); cin >> n; while(n--) { memset(vis, false, sizeof(vis)); cin >> s; cout << query(change(s)) << endl; } cout << endl; } return 0;}
阅读全文
0 0
- [kuangbin带你飞]专题17:D
- [kuangbin带你飞]专题17:A
- [kuangbin带你飞]专题17:B
- [kuangbin带你飞]专题17:C
- [kuangbin带你飞]专题一 简单搜索 D - Fliptile
- [kuangbin带你飞]专题一 简单搜索 D poj3279
- [kuangbin带你飞]专题四 最短路练习D
- [kuangbin带你飞]专题六 最小生成树 D
- [kuangbin带你飞]专题八 生成树 D
- [kuangbin带你飞]专题一 简单搜索 -D
- [kuangbin带你飞]专题二-搜索进阶-D-Escape
- 3279 &[kuangbin带你飞]专题一 简单搜索 D
- [kuangbin带你飞]专题二 搜索进阶 D
- [kuangbin带你飞]专题一 简单搜索 D
- [kuangbin带你飞]专题1 简单搜索 D
- [kuangbin带你飞]专题一 简单搜索 (17/1000)
- kuangbin带你飞 专题一
- [kuangbin带你飞]专题一 简单搜索D - Fliptile(POJ 3279)
- BZOJ 1537: [POI2005]Aut- The Bus 树状数组
- 图形视图框架中自定义QGraphicsItem
- unity_NGUI系统学习(四)_Atlas图集的创建和使用_Button触发状态还可以用图片做背景效果设定
- 线性回归:最小二乘法
- CSS3-使用纯css绘制天猫logo
- [kuangbin带你飞]专题17:D
- lotus预定义域的使用
- OKHTTP
- 典型的生产者消费者模式
- Jzoj3717【NOI2014模拟7.2】火车
- hdu2594--kmp入门题
- 一、GNUmake与Makefile的简介
- java线程同步 Lock同步锁
- laravel-excel文档翻译笔记