原题地址

看了这篇博文,总算是把Trie图弄明白了

Runtime Error了无数次,一直不知道为什么,于是写了个脚本生成了一组大数据,发现果然段错误了。

调试了一下午,总算闹明白了,为什么呢?

1. 空间超大的变量不要放在函数里,会爆栈,应该弄成全局变量或者是从堆上动态分配。

2. 看清题目的数据范围,一开始我的MAX_NODE设的是1024。。。

代码:

 #include <iostream>
#include <cstring> using namespace std; #define MAX_NODE 1000010
#define SIGMA_SIZE 32 int q[MAX_NODE]; struct TrieGraph {
int f[MAX_NODE];
int g[MAX_NODE][SIGMA_SIZE];
int m[MAX_NODE];
int size; void init() {
size = ;
memset(f, , sizeof(f));
memset(g[], , sizeof(g[]));
} int index(char c) {
return c - 'a';
} void insert(const char *s) {
int u = ;
while (*s) {
int i = index(*s);
if (!g[u][i]) {
memset(g[size], , sizeof(g[size]));
m[size] = ;
g[u][i] = size++;
}
u = g[u][i];
s++;
}
m[u] = ;
} void build() {
int qh = , qt = ;
f[] = ;
for (int i = ; i < ; i++) {
int &p = g[][i];
if (p) {
f[p] = ;
q[qt++] = p;
}
else
p = ;
}
while (qh < qt) {
int u = q[qh++];
for (int i = ; i < ; i++) {
int &v = g[u][i];
if (v) {
q[qt++] = v;
f[v] = g[f[u]][i];
m[u] |= m[f[u]];
}
else
v = g[f[u]][i];
}
}
} bool find(const char *s) {
int u = ;
while (*s) {
int i = index(*s);
while (u && !g[u][i])
u = f[u];
u = g[u][i];
if (m[u])
return true;
s++;
}
return false;
}
} tg; int main() {
int N;
string s; tg.init();
cin >> N;
for (int i = ; i < N; i++) {
cin >> s;
tg.insert(s.c_str());
}
tg.build();
cin >> s;
cout << (tg.find(s.c_str()) ? "YES" : "NO") << endl;
return ;
}

hihoCoder#1036 Trie图的更多相关文章

  1. hihoCoder 1036 Trie图 AC自动机

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

  2. 【hihoCoder】1036 Trie图

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

  3. hihoCoder week4 Trie图

    ac自动机 题目链接 https://hihocoder.com/contest/hiho4/problem/1 参考:https://blog.csdn.net/baidu_30541191/art ...

  4. 1036 : Trie图 (AC自动机)

    题目大意: 输入 n 个目标单词和一个文本串,判断文本串中是否存在某些目标单词. 思路 赤裸裸的 AC自动机. 代码: #include<iostream> #include<cst ...

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

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

  6. 【hihoCoder 1036】Trie图

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

  7. HihoCoder第四周:Trie图

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

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

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

  9. Trie 图

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

随机推荐

  1. egrep命令的实现 分类: 编译原理 2014-06-01 23:41 329人阅读 评论(0) 收藏

    本程序实现了egrep命令,首先将正则表达式转换为NFA,并实现模拟NFA的算法. 本程序使用flex实现词法分析,bison实现语法分析 若给定的一行字符串中存在一个字串能被该NFA接受,则输出整行 ...

  2. pycharm的使用小技巧111

    如果你想快速敲出if __name__ == '__main__':只需你敲个main 然后回车就ok了 import和from xx模块 import *的区别是前者使用时要加模块名加点,后者可以直 ...

  3. [转]强制取消TFS2008中其它成员的签出文件

    本文转自:http://www.cnblogs.com/georgehu/archive/2010/10/23/1859573.html 有个项目,以前的成员离职了,刚好又签出了一个文件在TFS中并且 ...

  4. AJPFX关于Java Object类常用方法小总结

    java.lang.Object   java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. Object类 ...

  5. hihocoder offer收割编程练习赛11 A hiho字符串

    思路: 我用的尺取. 注意题目描述为恰好2个'h',1个'i',1个'o'. 实现: #include <iostream> #include <cstdio> #includ ...

  6. swiper4实现的拥有header和footer的全屏滚动demo/swiper fullpage footer

    用swiper4实现的拥有header和footer的全屏滚动demo, <!DOCTYPE html> <html lang="en"> <head ...

  7. CCF|打酱油|Java

    import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = ...

  8. No rule to make target ...

    在编译一个Android上的jni的时候出现了如下的问题 make[3]: *** No rule to make target `/home/zhang/android1/src/androidpk ...

  9. CSS——BFC

    http://www.cnblogs.com/lhb25/p/inside-block-formatting-ontext.html 元素若不是bfc,那么内部浮动元素的高度不参与计算 元素若不是bf ...

  10. ubuntu服务器建立apache虚拟主机

    启用与停用站点的方法 a2ensite 站点名 a2dissite 站点名 基于名字的(通过域名来区分)的虚拟主机 安装好apache以后默认有一个叫default的虚拟主机.新建虚拟主机时可以直接复 ...