ac自动机

题目链接 https://hihocoder.com/contest/hiho4/problem/1

参考:https://blog.csdn.net/baidu_30541191/article/details/47447175#

#include <iostream>
#include <cstring>
#include <string>
#include <queue>
using namespace std; struct node
{
node *nxt[], *fail;
int ok;
node() {
ok = ;
for(int i=; i<; i++) nxt[i]=NULL;
fail=NULL;
}
}; const int N = 1e6 + ;
char s[N];
node *root; void ins(char *s, int len)
{
node *rt = root;
for(int i=; i<len; i++) {
int x= s[i]-'a';
if(rt->nxt[x] == NULL)
rt->nxt[x] = new node();
rt= rt->nxt[x];
}
rt->ok = ;
return ;
} void build()
{
node *rt = root;
rt->fail = NULL; queue<node*> que;
que.push(rt); while(!que.empty()) {
node *tmp = que.front();
que.pop();
for(int i=; i<; i++) {
if(tmp->nxt[i] != NULL) {
if(tmp == root)
tmp->nxt[i]->fail = root;
else {
node *p = tmp->fail;
while(p!=NULL) {
if(p->nxt[i] != NULL) {
tmp->nxt[i]->fail = p->nxt[i];
break;
}
p = p->fail;
}
if(p==NULL) tmp->nxt[i]->fail = root;
}
que.push(tmp->nxt[i]);
}
}
}
} bool query(char *s, int len)
{
node *rt = root;
int cnt=;
for(int i=; i<len; i++) {
int x = s[i]-'a';
while(!rt->nxt[x] && rt->fail != NULL)
rt=rt->fail;
rt=rt->nxt[x];
if(!rt) rt = root;
node * tmp = rt;
while(tmp->ok==) {
cnt++;
tmp->ok = ;
tmp = tmp->fail;
}
}
if(cnt > )
return true;
return false;
} int main()
{
root = new node();
int n; scanf("%d",&n);
for(int i=; i<n; i++) {
scanf("%s", s), ins(s, strlen(s));
} build();
scanf("%s", s);
bool ok = query(s,strlen(s));
if(ok)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return ;
}

hihoCoder week4 Trie图的更多相关文章

  1. hihoCoder#1036 Trie图

    原题地址 看了这篇博文,总算是把Trie图弄明白了 Runtime Error了无数次,一直不知道为什么,于是写了个脚本生成了一组大数据,发现果然段错误了. 调试了一下午,总算闹明白了,为什么呢? 1 ...

  2. hihoCoder 1036 Trie图 AC自动机

    题意:给定n个模式串和一个文本串,判断文本中是否存在模式串. 思路:套模板即可. AC代码 #include <cstdio> #include <cmath> #includ ...

  3. 【hihoCoder】1036 Trie图

    题目:http://hihocoder.com/problemset/problem/1036 给一个词典dict,词典中包含了一些单词words.要求判断给定的一个文本串text中是否包含这个字典中 ...

  4. 【hihoCoder 1036】Trie图

    看了一下简单的$Trie图$,调模板调啊调一连调了$2h$,最后发现$-'a'$打成$-'A'$了hhh,有种摔键盘的冲动. $Trie图$是$Trie树$上建立“前缀边”,不用再像在$Trie树$上 ...

  5. HihoCoder第四周:Trie图

    第四周的题目是前两周的综合,综合在一个是KMP算法的思想,一个是树的这么一个数据结构. 题目 : Trie图 输入 每个输入文件有且仅有一组测试数据. 每个测试数据的第一行为一个整数N,表示河蟹词典的 ...

  6. Trie 图

    时间限制:20000ms 单点时限:1000ms 内存限制:512MB 描述 前情回顾 上回说到,小Hi和小Ho接受到了河蟹先生伟大而光荣的任务:河蟹先生将要给与他们一篇从互联网上收集来的文章,和一本 ...

  7. hiho一下 第二周&第四周:从Trie树到Trie图

    hihocoder #1014 题目地址:http://hihocoder.com/problemset/problem/1014 hihocoder #1036 题目地址: http://hihoc ...

  8. 【AC自动机&&Trie图】积累

    以前KMP和后缀系列(主要是后缀数组,后缀自动机),都刷了一定数量的题,但是对于AC自动机,却有些冷落,罪过. 但是我感觉,在蓝桥杯比赛中AC自动机出现的概率比后缀系列大,简单的会考匹配,稍难一点会考 ...

  9. 小菜鸟 菜谈 KMP->字典树->AC自动机->trie 图 (改进与不改进)

    本文的主要宗旨是总结自己看了大佬们对AC自动机和trie 图 的一些理解与看法.(前沿:本人水平有限,总结有误,希望大佬们可以指出) KMP分割线--------------------------- ...

随机推荐

  1. PE结构图示

  2. anconda1.8+cuda9.0+cudnn7.0.5+tensorflow1.7(win10)安装

    1.下载安装cuda9.0 https://developer.nvidia.com/cuda-90-download-archive 2.下载cudnn7.0.5,下载cuda9.0的对应版本 ht ...

  3. 为什么C++函数形参默认值从最末一个赋值?

    [1]函数调用时形参的压栈顺序 1.示例代码如下(VS2010): #include <iostream> using namespace std; ); void fun(int a, ...

  4. PLSA主题模型

    主题模型 主题模型这样理解一篇文章的生成过程: 1.          确定文章的K个主题. 2.          重复选择K个主题之一,按主题-词语概率生成词语. 3.          所有词语 ...

  5. 【Alpha版本】冲刺阶段——Day2

    [Alpha版本]冲刺阶段--Day2 阅读目录 今日进展 问题困难 明日任务 今日贡献量 站立式会议 TODOlist [今日进展] 密码算法方面: 存储密码的步骤 使用CSPRNG生成一个长度足够 ...

  6. tomcat1章1

    package ex01.pyrmont; import java.net.Socket; import java.net.ServerSocket; import java.net.InetAddr ...

  7. DOM jquery

    DOM  文档对象模型(Document Object Model)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.我们最为关心的是,DOM ...

  8. 前端框架VUE----箭头函数

    箭头函数 基本语法: ES6允许使用“箭头”(=>)定义函数 var f = a = > a //等同于 var f = function(a){ return a; } 如果箭头函数不需 ...

  9. solr 使用指定数据源

    1,将solr 解压,我们观察发现它其实即可以是web服务也可以做数据分析 数据库 2,我们在example目录下新建一个hai的文件夹,用于存放数据 参考solr 目录,将solr.xml 复制一份 ...

  10. Struts2 概述

    1. struts2应用在javaee三层结构中web层框架 2. struts2框架在struts1和webwork基础之上的发展全新的框架 3.struts2 解决的问题: 用户管理的crud操作 ...