hdu2896 病毒侵袭 AC自动机入门题 N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,
- /**
- 题目:hdu2896 病毒侵袭
- 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896
- 题意:N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同),
- M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,
- 题目保证每个待匹配串中最多有三个模式串。
- 思路:ac自动机做法,字符为可见字符,那么直接就是他们的ascii值作为每一个字符的标志。最多128;
- 由于不超过三个,所以找到3个就可以return ;节约时间。
- AC自动机好文章:http://www.cppblog.com/menjitianya/archive/2014/07/10/207604.html
- */
- #include<bits/stdc++.h>
- using namespace std;
- #define P pair<int,int>
- #define ms(x,y) memset(x,y,sizeof x)
- #define LL long long
- const int maxn = ;
- const int mod = 1e9+;
- const int maxnode = *+;
- const int sigma_size = ;
- vector<int> ans;
- struct AhoCorasickAutomata
- {
- int ch[maxnode][sigma_size];
- int val[maxnode];
- int sz;
- int f[maxnode];
- int last[maxnode];
- void clear(){sz = ; memset(ch[],,sizeof ch[]); }
- int idx(char c){return c-'a'; }
- void insert(char *s,int x)
- {
- int u = , n = strlen(s);
- for(int i = ; i < n; i++){
- //int c = idx(s[i]);
- int c = s[i];
- if(!ch[u][c]){
- memset(ch[sz], , sizeof ch[sz]);
- val[sz] = ;
- ch[u][c] = sz++;
- }
- u = ch[u][c];
- }
- val[u] = x;
- }
- void find(char *T){
- int n = strlen(T);
- int j = ;
- for(int i = ; i < n; i++){
- int c = T[i];
- //while(j&&!ch[j][c]) j = f[j];
- j = ch[j][c];
- if(val[j]) print(j);
- else if(last[j]) print(last[j]);
- if(ans.size()==) return ;
- }
- }
- void print(int j)
- {
- if(j){
- ans.push_back(val[j]);
- if(ans.size()==) return ;
- print(last[j]);
- }
- }
- void getFail(){
- queue<int> q;
- f[] = ;
- for(int c = ; c < sigma_size; c++){
- int u = ch[][c];
- if(u){f[u] = ; q.push(u); last[u] = ;}
- }
- while(!q.empty()){
- int r = q.front(); q.pop();
- for(int c = ; c < sigma_size; c++){
- int u = ch[r][c];
- if(!u){
- ch[r][c] = ch[f[r]][c]; continue;
- }//if(!u) continue;
- q.push(u);
- int v = f[r];
- while(v&&!ch[v][c]) v = f[v];
- f[u] = ch[v][c];
- last[u] = val[f[u]] ? f[u] : last[f[u]];
- }
- }
- }
- } ac ;
- char s[];
- int main()
- {
- int n, m;
- while(scanf("%d",&n)==)
- {
- ac.clear();
- for(int i = ; i <= n; i++){
- scanf("%s",s);
- ac.insert(s,i);
- }
- ac.getFail();
- scanf("%d",&m);
- int cnt = ;
- for(int i= ; i <= m; i++){
- ans.clear();
- scanf("%s",s);
- ac.find(s);
- if(ans.size()!=){
- cnt++;
- printf("web %d:",i);
- sort(ans.begin(),ans.end());
- for(int j = ; j < (int)ans.size(); j++){
- printf(" %d",ans[j]);
- }
- printf("\n");
- }
- }
- printf("total: %d\n",cnt);
- }
- return ;
- }
- /*
- 3
- aaa
- bbb
- ccc
- 2
- aaabbbccc
- bbaacc
- */
hdu2896 病毒侵袭 AC自动机入门题 N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,的更多相关文章
- HDu-2896 病毒侵袭,AC自动机模板题!
病毒侵袭 模板题,不多说了.. 题意:n个不同的字符串分别代表病毒特征,给出m次查询,每次一个字符串(网址),求这个字符串中有几个病毒特征,分别从大到小输出编号,最后输出所有的带病毒网址个数.格式请看 ...
- HDU2896 病毒侵袭 —— AC自动机
题目链接:https://vjudge.net/problem/HDU-2896 病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- hdu2896 病毒侵袭 ac自动机
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=2896 题目: 病毒侵袭 Time Limit: 2000/1000 MS (Java/Othe ...
- hdu2896病毒侵袭(ac自动机)
链接 ac自动机的模板题 说2个注意的地方 一是题目说明包含所有ASCII字符,可以开到0-127 包含空格 题目会输入多个源串,在加完当前的val值时,不应清0,可以开个标记数组. #include ...
- hdu 2896 病毒侵袭 AC自动机 基础题
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU2896 病毒侵袭 AC自动机模板
各种MLE,这模板感觉有问题,next数组开128也会MLE,实际上可见字符为编号32~126,只用开100就行. #include <iostream> #include <cst ...
- hdu2222 KeyWords Search AC自动机入门题
/** 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:题意:给定N(N <= 10000)个长度不大于50的模式串,再给定一个长度为L ...
- hdu 2896 病毒侵袭 ac自动机
/* hdu 2896 病毒侵袭 ac自动机 从题意得知,模式串中没有重复的串出现,所以结构体中可以将last[](后缀链接)数组去掉 last[]数组主要是记录具有相同后缀模式串的末尾节点编号 .本 ...
- hdu 2896 病毒侵袭 AC自动机(查找包含哪些子串)
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
随机推荐
- NYOJ-------笨蛋难题四
笨蛋难题四 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 这些日子笨蛋一直研究股票,经过调研,终于发现xxx公司股票规律,更可喜的是 笨蛋推算出这 ...
- struts2 xml配置文件配置传参数
传参方式 重定向 第一方式: <action name="search" method="search" class="c ...
- OpenXml读取word内容注意事项
OpenXml读取word内容注意事项 1.使用OpenXml读取word内容,word后缀必须是".docx":如果word后缀是".doc"需要转成&quo ...
- 摘:VC开发数据库基础之ADO篇
一.ADO简介ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,请不必为此担心,即使你对OLE DB,COM ...
- 图解最小生成树 - 克鲁斯卡尔(Kruskal)算法
我们在前面讲过的<克里姆算法>是以某个顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树的.同样的思路,我们也可以直接就以边为目标去构建,因为权值为边上,直接找最小权值的边来构建生成树 ...
- Unix环境高级编程(八)进程关系
本章看后给人似懂非懂的感觉,主要是不知道实际当中如何去使用.通过前面几章的学习,每个进程都有一个父进程,当子进程终止时,父进程得到通知并取得子进程的退出状态.先将本章基本的知识点总结如下,日后再看时候 ...
- Cocos2d-x游戏移植到WP8之路 -- c++和c#交互
Cocos2d-x是眼下最流行的手机游戏引擎之中的一个,开源.轻量.多平台等的诸多特性使得它被非常多国内外手游开发人员所喜爱. 利用Cocos2d-x来开发Windows Phone 8的游戏相同也是 ...
- 温故而知新 gulp.src 指定数组文件夹
gulp.src语法是基于这个库来实现的,所以详情请看这个API: https://www.gulpjs.com.cn/docs/api/ https://github.com/isaacs/node ...
- Latex中定义、定理、引理、证明 设置方法总结
Latex中定义.定理.引理.证明 设置方法总结 在LaTex中需要有关定理.公理.命题.引理.定义等时,常用如下命令 \newtheorem{定理环境名}{标题}[主计数器名] \newtheore ...
- Spring里的aop实现方式和源码分析
使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点.业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点.横切关注点的一个特点是,他们经常发生在核心关 ...