[hdu1277]全文检索(AC自动机)
解题关键:AC自动机模板题,注意字符匹配时若无法匹配,直接用%s即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=;
const int MAXN=;
int num,ans[],nn;
bool vis[];
bool flag=false;
struct Trie{//数组形式
int Next[MAXN][N],Fail[MAXN],End[MAXN],root,tot;//大小为所以匹配字符串的总和
int newnode(){//结构体内部用
for(int i=;i<N;i++) Next[tot][i]=-;
End[tot++]=;
return tot-;
}
void init(){
tot=;
root=newnode();
}
void insert(char buf[],int x){
int len=strlen(buf);
int now=root;//now是temp指针
for(int i=;i<len;i++){
int k=buf[i]-'0';
if(Next[now][k]==-) Next[now][k]=newnode();//next数组代表的是下一个字符索引
now=Next[now][k];
}
End[now]=x;//end数组是当前字符串的个数.字典中可能有相同的单词,若只算一次,改为1.
}
void build(){//构造fail指针,后缀是某些前缀
queue<int>que;
Fail[root]=root;
for(int i=;i<N;i++){
if(Next[root][i]==-) Next[root][i]=root;
else{
Fail[Next[root][i]]=root;
que.push(Next[root][i]);
}
}
while(!que.empty()){//bfs,会将所有的匹配子串都遍历到
int now=que.front();
que.pop();
for(int i=;i<N;i++){
if(Next[now][i]==-) Next[now][i]=Next[Fail[now]][i];
else{
Fail[Next[now][i]]=Next[Fail[now]][i];//fail指向最长的
que.push(Next[now][i]);
}
}
}
}
void query(char buf[]){
int len=strlen(buf),now=root;
for(int i=;i<len;i++){
now=Next[now][buf[i]-'0'];
int temp=now;
while(temp!=root){
if(End[temp]&&!vis[temp]) ans[nn++]=End[temp],vis[temp]=true,flag=true;
temp=Fail[temp];
}
}
}
}; Trie ac;
char buf[],buf2[],tmp[];
int n,m;
int main(){
while(scanf("%d%d",&m,&n)!=EOF){
memset(ans,,sizeof ans);
memset(vis,,sizeof vis);
nn=;
ac.init();
int t=;
flag=false;
for(int i=;i<=m;i++){
scanf("%s",tmp);
strcat(buf,tmp);
}
for(int i=;i<=n;i++){
scanf("%*s %*s %d] %s",&num,buf2);
ac.insert(buf2,num);
}
ac.build();//不要忘记build
ac.query(buf);
if(flag){
printf("Found key:");
for(int i=;i<nn;i++){
printf(" [Key No. %d]",ans[i]);
}
printf("\n");
}
else printf("No key can be found !\n");
}
return ;
}
[hdu1277]全文检索(AC自动机)的更多相关文章
- 基于trie树做一个ac自动机
基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...
- AC自动机-算法详解
What's Aho-Corasick automaton? 一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一. 简单的说,KMP用来在一篇文章中匹配一个模式串:但 ...
- python爬虫学习(11) —— 也写个AC自动机
0. 写在前面 本文记录了一个AC自动机的诞生! 之前看过有人用C++写过AC自动机,也有用C#写的,还有一个用nodejs写的.. C# 逆袭--自制日刷千题的AC自动机攻克HDU OJ HDU 自 ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3198 Solved: 1532[Submit][Status ...
- BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]
1212: [HNOI2004]L语言 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1367 Solved: 598[Submit][Status ...
- [AC自动机]【学习笔记】
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)To ...
- AC自动机 HDU 3065
大概就是裸的AC自动机了 #include<stdio.h> #include<algorithm> #include<string.h> #include< ...
- AC自动机 HDU 2896
n个字串 m个母串 字串在母串中出现几次 #include<stdio.h> #include<algorithm> #include<string.h> #inc ...
随机推荐
- oracle [union.minus.intersect]
union 两张表的相同字段的数据[记录类型和列数要一致],合并,并且去重 can replace with "in" (但是如果是两个不同的表而且没什么关联的话必须要union了 ...
- 几篇QEMU/KVM代码分析文章
QEMU/KVM结合起来分析的几篇文章,代码跟最新的版本有些差异,但大体逻辑一样,写得通俗易懂.我把链接放这里主要是为自己需要查看时调转过去方便,感谢作者的付出! QEMU Source Code S ...
- forEach for for in for of性能问题
var arr = new Array(1000); console.time('forEach'); arr.forEach(data => { }); console.timeEnd('fo ...
- 第一个php小程序(学习)
</pre><pre name="code" class="php"><? php $b=array("name&quo ...
- JavaScript中批量设置Css样式
设置 input 元素的 属性: document.getElementsByTagName("INPUT")[0].setAttribute("属性",&q ...
- 15款创建美丽幻灯片的 jQuery 插件
1. Skippr Skippr 是一个超级简单的 jQuery 幻灯片插件.仅仅是包含你的网页中引入 jquery.skippr.css 和 jquery.skippr.js 文件就能使用了. Sk ...
- 20170319 ABAP 生成XML文件
方法一:ABAP 使用method方式操作XML 转自:http://www.cnblogs.com/jiangzhengjun/p/4265595.html 方法二:STRANS 转换工具;使用st ...
- machine learning for hacker记录(1) R与机器学习
开篇:首先这本书的名字很霸气,全书内容讲的是R语言在机器学习上面的应用,一些基本的分类算法(tree,SVM,NB),回归算法,智能优化算法,维度约减等,机器学习领域已经有很多成熟的R工具箱,毕竟这个 ...
- HTTP1.1学习笔记 -- RFC2616
本人跟web无缘,从来没有想去学http,现在看来,学学也是有益无害,总会要用着点滴. RFC见这里: https://www.ietf.org/rfc/rfc2616.txt 0. URI格式 ht ...
- ORACLE 表空间扩展
最近公司在对即将上线的系统做数据迁移和压力测试,于是乎需要和 Oracle 经常的打交道.今天正好碰到了表空间的问题,记录下来以后备用.也是最近才学习到的,原来 Oracle 表空间也是有大小限制的, ...