大致题意:
给出n个模式串,m个文本串。对于每个文本串,求出哪些模式串在这个文本串中出现过。最后求出能够包含模式串的文本串总数。
大致思路:
ac自动机模版的小小变形,要注意字符集是所有128个ASCII码可见字符。这道题用静态字典树的优化效果并不明显。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include <algorithm>
using namespace std;
const int inf=1<<28;
const int nMax=500;
const int mMax=500005;
class node{
public:
int id;
int vis; //前缀记录标志
node *next[130],*fail;
}*root,*que[mMax],num[500000];
bool vist[mMax];
int x,cnt;
node *newnode(){
node * p = num + x++;
for(int i = 0; i <130; i++){
p->next[i] = NULL;
}
p->id=-1;
p->fail=NULL;
p->vis=0;
return p;
}
void insert(char *s){ //构造前缀树
int i;
node *r=root;
int l=strlen(s);
for(i=0;i<l;i++){
int loc=s[i];
if(r->next[loc]==NULL){
r->next[loc]=newnode();
}
r=r->next[loc];
}
if(r->id==-1)r->id=cnt++;
r->vis++;
}
void acAuto(){ //用bfs为每个节点设定fail指针
int i,head=0,tail=0;
node *p,*tmp;
root->fail=NULL;
que[tail++]=root;
while(head<tail){
tmp=que[head++];
for(i=0;i<130;i++){
if(tmp->next[i]==NULL)continue;
if(tmp==root){
tmp->next[i]->fail=root;
}
else {
for(p=tmp->fail;p!=NULL;p=p->fail){
if(p->next[i]!=NULL){
tmp->next[i]->fail=p->next[i];
break;
}
}
if(p==NULL){
tmp->next[i]->fail=root;
}
}
que[tail++]=tmp->next[i];
}
}
}
int search(char *msg){
int i,idx,ans=0;
node *p=root,*tmp;
for(i=0;msg[i];i++){
idx=msg[i];
while(p->next[idx]==NULL&&p!=root){
p=p->fail;
}
p=p->next[idx];
if(p==NULL)p=root;
for(tmp=p;tmp!=NULL;tmp=tmp->fail){//&&tmp->vis!=-1
// ans+=tmp->vis;
tmp->vis=-1;
if(tmp->id!=-1){
ans=1;
vist[tmp->id]=1;
}
}
}
return ans;
}
int main(){
int n,m,i,sum;
char str[502],text[10002];
while(scanf("%d",&n)!=EOF){
x=0;
sum=0;
cnt=1;
root=newnode();
for(i=0;i<n;i++){
scanf("%s",str);
insert(str);
}
acAuto();
scanf("%d",&m);
for(i=1;i<=m;i++){
memset(vist,0,sizeof(vist));
scanf("%s",text);
if(search(text)!=0){
sum++;
printf("web %d:",i);
for(int j=1;j<=n;j++){
if(vist[j]){
printf(" %d",j);
}
}
printf("\n");
}
}
printf("total: %d\n",sum);
}
return 0;
}
分享到:
相关推荐
多模式匹配 ac自动机 dawg自动机多模式匹配 ac自动机 dawg自动机多模式匹配 ac自动机 dawg自动机多模式匹配 ac自动机 dawg自动机多模式匹配 ac自动机 dawg自动机多模式匹配 ac自动机 dawg自动机多模式匹配 ac自动机 ...
供信息学奥林匹克竞赛选手使用 AC自动机模板
要学AC自动机需要自备两个前置技能:KMP和trie树(其实个人感觉不会kmp也行,失配指针的概念并不难) 其中,KMP是用于一对一的字符串匹配,而trie虽然能用于多模式匹配,但是每次匹配失败都需要进行回溯,如果模式串很长的话...
基于单模式串和 Trie 树实现的敏感词过滤我们前面几节讲了好几种字符串匹配算法,有 BF 算法、RK 算法、BM 算法、KMP 算法,前面四种算法都是单模式串
AC自动机算法(Aho-Corasick 多模式匹配算法)C#实现
程序是基于本程序作者刘文在《复杂系统与复杂性科学》上发表的论文《基于元胞自动机的短信网络病毒传播模拟》
AC自动机AC自动机AC自动机AC自动机
AC自动机算法是解决这种问题的一个经典方法,时间复杂度为O(n+m+z),其中z是T中出现的模式串的数量。AC自动机是基于keyword tree的,并对其进行一些补充。
相当给力,头文件中附带了简单的使用方法,使用istream当接口,因此你可以传入stringstream或fstream,甚至可以自己派生istream再传入,支持全文查找和增量查找两种模式,有问题可以联系我
AC自动机算法的实现。AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章...
AC自动机算法
关于AC自动机的pdf文档,很清楚的讲解了AC自动机算法及应用
C语言实现,效率极高,实现了中文的关键字匹配,输出的格式为偏移量加上关键字(中文编码为GB2312)
关于AC自动机的详细的讲解+标程,还有一些例题的讲解。
本项目是一款高效的Java敏感词过滤系统,基于AC自动机算法实现。系统支持独立部署,同时可便捷集成至注册中心,为各类项目提供敏感词过滤服务。包含文件共117个,其中主要构成如下: - Java源文件:49个 - Class...
AC自动机实现多模式串匹配,支持中文系统,同时可以支持多个模式串,测试使用Linux和Windows系统,使用20条模式串,中英文混合,测试通过
文学研究助手,AC自动机版本,数据结构 利用AC自动机只对文件进行一次扫描,统计要查询的单词在文档出现的次数及所在行
AC自动机模板,直接套,有注释N的范围,适合初学者学习
基于字典树的ac自动机,自己前期的实现,具有源码参考,用于查找可屏蔽应用
中文AC自动机,可以用于中文字符串,可以结合中文分词使用