AC自动机 HDU 2896
n个字串
m个母串
字串在母串中出现几次
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
#include<vector> using namespace std;
#define MAXN 130 //AC自动机
class node
{
public:
int index;
node * fail;
node * next[MAXN];
node()
{
index=;
fail=;
memset(next,,sizeof(next));
}
};
node *root;
//插入操作 来看自动机的肯定看过tire 没看过就别看了
void Insert(char *s,int id)
{
node *p=root;
while(*s)
{
int ind=*s-' ';
if(!p->next[ind])
p->next[ind]=new node;
p=p->next[ind];
s++;
}
p->index=id;
}
queue<node*>q1; void Build()
{
q1.push(root);
root->fail=NULL;//根节点
while(!q1.empty())
{
node *p=NULL;
node *now=q1.front();
q1.pop();
for(int i=;i<MAXN;i++)
{
if(now->next[i]) //存在
{
if(now==root) //第二层的话直接就到根
now->next[i]->fail=root;
else
{
p=now->fail;
while(p) //从父亲节点开始找 一直到存在这个孩子节点相同的字母 其实就是后缀相同了
{
if(p->next[i])
{
now->next[i]->fail=p->next[i];
break;
}
p=p->fail;
}
if(p==NULL)
now->next[i]->fail=root;
}
q1.push(now->next[i]);
}
}
} }
bool flag[];
vector<int>z[];
char s1[];
void Ques(char *s1,int id)
{
node *p=root;
memset(flag,,sizeof(flag));
int ind,len=strlen(s1);
for(int i=;i<len;i++)
{
ind=s1[i]-' ';
while(p->next[ind]==NULL&&p!=root)//存在的
p=p->fail;
p=p->next[ind];
if(!p)
p=root;
node *now=p;
while(now!=root&&!flag[now->index])//一个一个检验 这边是否有可以匹配的 子串 后缀相同
{
if(now->index)
{
z[id].push_back(now->index);
flag[now->index]=;
}
now=now->fail;
}
if(z[id].size()>=)
break;
}
} int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{ getchar();
char s[];
root=new node;
for(int i=;i<=n;i++)
{
scanf("%s",s);
Insert(s,i);
}
Build();
int m;
scanf("%d",&m);
int ans=;
for(int i=;i<=m;i++)
{
z[i].clear();
scanf("%s",s1);
Ques(s1,i);
if(z[i].size()>)
{
sort(z[i].begin(),z[i].end());
ans++;
}
}
for(int i=;i<=m;i++)
{
if(z[i].size())
{
printf("web %d:",i);
for(int j=;j<z[i].size();j++)
printf(" %d",z[i][j]);
printf("\n");
}
}
printf("total: %d\n",ans);
}
return ;
}
AC自动机 HDU 2896的更多相关文章
- 数据结构--AC自动机--hdu 2896
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- AC自动机 HDU 3065
大概就是裸的AC自动机了 #include<stdio.h> #include<algorithm> #include<string.h> #include< ...
- 从0开始 数据结构 AC自动机 hdu 2222
参考博客 失配指针原理 使当前字符失配时跳转到另一段从root开始每一个字符都与当前已匹配字符段某一个后缀完全相同且长度最大的位置继续匹配,如同KMP算法一样,AC自动机在匹配时如果当前字符串匹配失败 ...
- AC自动机 HDU 2222
t n个字串 1个母串 求出现几个字串 字串可能重复 #include<stdio.h> #include<algorithm> #include<string.h> ...
- (17/34)AC自动机/后缀数组/后缀自动机(施工中)
快补题别再摸鱼了(17/34) 1.AC自动机 #define maxnode 1000010 #define maxsize 26 struct ahocT{ int ch[maxnode][max ...
- hdu 2896 AC自动机
// hdu 2896 AC自动机 // // 题目大意: // // 给你n个短串,然后给你q串长字符串,要求每个长字符串中 // 是否出现短串,出现的短串各是什么 // // 解题思路: // / ...
- hdu 2896 病毒侵袭 ac自动机
/* hdu 2896 病毒侵袭 ac自动机 从题意得知,模式串中没有重复的串出现,所以结构体中可以将last[](后缀链接)数组去掉 last[]数组主要是记录具有相同后缀模式串的末尾节点编号 .本 ...
- AC自动机 - 多模式串的匹配运用 --- HDU 2896
病毒侵袭 Problem's Link:http://acm.hdu.edu.cn/showproblem.php?pid=2896 Mean: 略 analyse: AC自动机的运用,多模式串匹配. ...
- HDU 2896 (AC自动机模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2896 题目大意:多个模式串.多个匹配串.其中串的字符范围是(0~127).问匹配串中含有哪几个模式串 ...
随机推荐
- 第三篇 Entity Framework Plus 之 Query Cache
离上一篇博客,快一周,工作太忙,只能利用休息日来写一些跟大家分享,Entity Framework Plus 组件系列文章,之前已经写过两篇 第一篇 Entity Framework Plus 之 A ...
- Yii2.x 互斥锁Mutex-类图
- 三大框架之hibernate入门
hibernate入门 1.orm hibernate是一个经典的开源的orm[数据访问中间件]框架 ORM( Object Relation Mapping)对象关 ...
- 《C#微信开发系列(Top)-微信开发完整学习路线》
年前就答应要将微信开发的学习路线整理给到大家,但是因为年后回来这段时间学校还有公司那边有很多事情需要兼顾,所以没能及时更新文章.今天特地花时间整理了下,话不多说,上图,希望对大家的学习有所帮助哈. 如 ...
- 解决mysql卸载后无法从新安装,卡在最后一步的问题
mysql服务出现问题往往是最麻烦的,往往需要重装,而重装很多人卸不干净残留文件,更加装不上.在下就遇到这个问题.重装mysql到最后一步时卡在了最后一步的第二条上 解决办法就是卸载后删注册表+删数据 ...
- ArcGIS Engine开发前基础知识(2)
ArcGIS基本控件简介 ArcGIS Engine控件是一组可视化的开发组件,每个ArcGIS Engine控件都是一个COM组件.这些组件包括MapControl,PageLayoutContro ...
- DevOps
DevOps DevOps(英文Development和Operations的组合)是一组过程.方法与系统的统称,用于促进开发(应用程序/软件工程).技术运营和质量保障(QA)部门之间的沟通.协作与整 ...
- 使用WebRTC搭建前端视频聊天室——信令篇
博客原文地址 建议看这篇之前先看一下使用WebRTC搭建前端视频聊天室——入门篇 如果需要搭建实例的话可以参照SkyRTC-demo:github地址 其中使用了两个库:SkyRTC(github地址 ...
- 自定义UITabBarController标签视图控制器
首先创建一个类,继承自UItabBarController 然后在.m文件中: 这里我有两个宏定义: #define WIDTH (myView.frame.size.width / 4) //我在写 ...
- 在Ubuntu和Linux Mint上安装Oracle JDK
在Ubuntu和Linux Mint上安装Oracle JDK 使用下面的命令安装,只需一些时间,它就会下载许多的文件,所及你要确保你的网络环境良好: sudo add-apt-repository ...