HDU 2896 病毒侵袭(AC自动机)题解
题意:给你n个模式串,再给你m个主串,问你每个主串中有多少模式串,并输出是哪些。注意一下,这里给的字符范围是可见字符0~127,所以要开130左右。
思路:用字典树开的时候储存编号,匹配完成后set记录保证不重复和排序。
代码:
#include<cstdio>#include<vector>#include<set>#include<queue>#include<cstring>#include<string>#include<cmath>#include<cstdlib>#include<algorithm>#define ll long longconst int maxn = 5000000+5;const int maxm = 100000+5;const int MOD = 1e7;const int INF = 0x3f3f3f3f;const int kind = 130;const char baset = 0;using namespace std;struct Trie{Trie *next[kind];Trie *fail; //失配值int sum; //以此为单词结尾的个数int id;Trie(){sum = 0;memset(next,NULL,sizeof(next));fail = NULL;id = 0;}};Trie *root;queue<Trie *> Q;int head,tail;set<int> record;void Insert(char *s,int id){Trie *p = root;for(int i = 0;s[i];i++){int x = s[i] - baset;if(p ->next[x] == NULL){p ->next[x] = new Trie();}p = p ->next[x];}p ->sum++;p ->id = id;}void buildFail(){ //计算失配值while(!Q.empty()) Q.pop();Q.push(root);Trie *p,*temp;while(!Q.empty()){temp = Q.front();Q.pop();for(int i = 0;i < kind;i++){if(temp ->next[i]){if(temp == root){ //父节点为root,fail为roottemp ->next[i] ->fail = root;}else{p = temp ->fail; //查看父节点的failwhile(p){if(p ->next[i]){temp ->next[i] ->fail = p ->next[i];break;}p = p ->fail;}if(p == NULL) temp ->next[i] ->fail = root;}Q.push(temp ->next[i]);}}}}void ac_automation(char *ch){//p为模式串指针Trie *p = root;int len = strlen(ch);for(int i = 0;i < len;i++){int x = ch[i] - baset;while(!p ->next[x] && p != root)p = p ->fail;p = p ->next[x]; //找到后p指针指向该结点if(!p) p = root; //若指针返回为空,则没有找到与之匹配的字符Trie *temp = p;while(temp != root){if(temp ->id > 0)record.insert(temp ->id);temp = temp ->fail;}}}char ch[210];char s[10005];int main(){int n,m,x;root = new Trie();scanf("%d",&n);for(int i = 1;i <= n;i++){scanf("%s",ch);Insert(ch,i);}buildFail();int tot = 0;scanf("%d",&m);for(int i = 1;i <= m;i++){record.clear();scanf("%s",s);ac_automation(s);if(record.size()){tot++;printf("web %d:",i);int End = record.size();for(int j = 1;j <= End;j++){int id = *record.begin();printf(" %d",id);record.erase(id);}printf("\n");}}printf("total: %d\n",tot);return 0;}
HDU 2896 病毒侵袭(AC自动机)题解的更多相关文章
- 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 ...
- hdu 2896 病毒侵袭 AC自动机 基础题
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU 2896 病毒侵袭 (AC自己主动机)
pid=2896">http://acm.hdu.edu.cn/showproblem.php?pid=2896 病毒侵袭 Time Limit: 2000/1000 MS (Java ...
- hdu 2896 病毒侵袭_ac自动机
题意:略 思路:套用ac自动机模板 #include <iostream> #include<cstdio> #include<cstring> using nam ...
- HDU 2896 病毒侵袭 AC自己主动机题解
本题是在text里面查找key word的增强版.由于这里有多个text. 那么就不能够简单把Trie的叶子标志记录改动成-1进行加速了,能够使用其它技术.我直接使用个vis数组记录已经訪问过的节点, ...
- HDU 2896 病毒侵袭(AC自动机水)
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU 2896 病毒侵袭(AC自动机)
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 2896 病毒侵袭【AC自动机】
<题目链接> Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一 ...
- hdu2896 病毒侵袭 ac自动机
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=2896 题目: 病毒侵袭 Time Limit: 2000/1000 MS (Java/Othe ...
随机推荐
- LeetCode——Add Digits
Description: Given a non-negative integer num, repeatedly add all its digits until the result has on ...
- JavaIO再回顾
File类 JavaIO访问文件名和文件检测相关操作 分隔符最好是使用File类提供的File.separator,使程序更加的健壮. File类提供的方法基本上是见名知意,例如getName()就是 ...
- [SQL] sql server中如何查看执行效率不高的语句
sql server中,如果想知道有哪些语句是执行效率不高的,应该如何查看呢?下面就将为您介绍sql server中如何查看执行效率不高的语句,供您参考.在测量功能时,先以下命令清除sql serve ...
- Android搜索自动提示功能 AutocompleteTextView
1.配置main.xml中自动提示控件: <AutoCompleteTextView android:id="@+id/autotv_searchresult" androi ...
- OC开发_Storyboard——iPad开发
iPad开发(Universal Applications) 一.iPad 1.判断是否在iPad上 BOOL iPad = ([[UIDevice currentDevice] userInterf ...
- oneThink发生错误,获取当前执行的SQL语句!
echo D('AnswerInfoView')->getLastSql();die();
- SpringBoot实现热加载方式
一. spring-boot-devtools方式1.在pom.xml中加入以下代码: 2.标识红线的地方加上 3.在设置里面加上自动编译 4.shift+ctrl+alt+/ 这样就可以了! 二.s ...
- Lucene.net之解决锁的问题
public sealed class SearchIndexManager { private static readonly SearchIndexManager searchManager=ne ...
- Visual Studio 2017正式版离线安装方法
Visual Studio 2017 RTM正式版离线安装及介绍. 首先至官网下载:https://www.visualstudio.com/zh-hans/downloads/ VS 2017 正式 ...
- Docker企业级仓库Harbor的安装配置与使用
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全.标识和管理等,扩展了开源Docker Distribution.作为一个企业级 ...