hihoCoder#1036 Trie图
看了这篇博文,总算是把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图的更多相关文章
- hihoCoder 1036 Trie图 AC自动机
题意:给定n个模式串和一个文本串,判断文本中是否存在模式串. 思路:套模板即可. AC代码 #include <cstdio> #include <cmath> #includ ...
- 【hihoCoder】1036 Trie图
题目:http://hihocoder.com/problemset/problem/1036 给一个词典dict,词典中包含了一些单词words.要求判断给定的一个文本串text中是否包含这个字典中 ...
- hihoCoder week4 Trie图
ac自动机 题目链接 https://hihocoder.com/contest/hiho4/problem/1 参考:https://blog.csdn.net/baidu_30541191/art ...
- 1036 : Trie图 (AC自动机)
题目大意: 输入 n 个目标单词和一个文本串,判断文本串中是否存在某些目标单词. 思路 赤裸裸的 AC自动机. 代码: #include<iostream> #include<cst ...
- hiho一下 第二周&第四周:从Trie树到Trie图
hihocoder #1014 题目地址:http://hihocoder.com/problemset/problem/1014 hihocoder #1036 题目地址: http://hihoc ...
- 【hihoCoder 1036】Trie图
看了一下简单的$Trie图$,调模板调啊调一连调了$2h$,最后发现$-'a'$打成$-'A'$了hhh,有种摔键盘的冲动. $Trie图$是$Trie树$上建立“前缀边”,不用再像在$Trie树$上 ...
- HihoCoder第四周:Trie图
第四周的题目是前两周的综合,综合在一个是KMP算法的思想,一个是树的这么一个数据结构. 题目 : Trie图 输入 每个输入文件有且仅有一组测试数据. 每个测试数据的第一行为一个整数N,表示河蟹词典的 ...
- 小菜鸟 菜谈 KMP->字典树->AC自动机->trie 图 (改进与不改进)
本文的主要宗旨是总结自己看了大佬们对AC自动机和trie 图 的一些理解与看法.(前沿:本人水平有限,总结有误,希望大佬们可以指出) KMP分割线--------------------------- ...
- Trie 图
时间限制:20000ms 单点时限:1000ms 内存限制:512MB 描述 前情回顾 上回说到,小Hi和小Ho接受到了河蟹先生伟大而光荣的任务:河蟹先生将要给与他们一篇从互联网上收集来的文章,和一本 ...
随机推荐
- DFS Gym 100553J Jokewithpermutation
题目传送门 /* 题意:将字符串分割成一个全排列 DFS:搜索主要在一位数和两位数的处理,用d1, d2记录个数,在不饱和的情况下,两种都试一下 DFS还是写不来,难道是在家里懒? */ #inclu ...
- android将对象序列化到文件:直接写文件与用Serializable接口的对比
1.用文件读写1024个对象的日志 10-09 16:12:44.493 6385-6385/com.example.tt.downtest D/Serializable_TAG: write 102 ...
- mysqlshow(数据库对象查看工具)
mysqlshow是mysql客户端对象查看工具,可以用来查看数据库.数据库中的表.表中的列.索引等. 1.mysqlshow命令的语法 shell > mysqlshow [options] ...
- (五)Mybatis总结之一对多、一对一
一对多 业务场景:张三既是java开发师又是大学老师又是LOL代练,张三拥有多个角色. 1.创建实体类UserInfo和RoleInfo package com.qf.mybatisdemo.pojo ...
- SCANF输入错误
while((a<=0||a>=10)||(b<=0||b>=10)) { fflush(stdin); cout<<" ...
- rem手机端页面自适应布局(待修正下一篇完美布局)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- restful api的简单理解
百度百科的描述:一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. RES ...
- UEFI启动 安装win8 win10 及windows server 2012 最简单的方法
纯UEFI模式只认U盘 纯UEFI模式下U盘安装的具体步骤其实很简单: 1.BIOS设置中启动项关闭兼容模式 ...
- 基于ANGULAR.JS的下一代WEB应用开发-01-yeoman
Angularjs 个人认为这是一款很好的框架!它将我们从AJAX应用的开发中解救了出来!嗯....废话就说道这里下面我们开始把! 首先我们必须了解一些核心的概念: 客户端模版 MVC 数据绑定 依赖 ...
- Bzoj 3307 雨天的尾巴(线段树合并+树上差分)
C. 雨天的尾巴 题目描述 N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多的是哪种物品. 输入格式 第 ...