CH601后缀数组【Trie树】
内含字典树创建及查询模板
1601 前缀统计 0x10「基本数据结构」例题
描述
给定N个字符串S1,S2...SN,接下来进行M次询问,每次询问给定一个字符串T,求S1~SN中有多少个字符串是T的前缀。输入字符串的总长度不超过10^6,仅包含小写字母。
输入格式
第一行两个整数N,M。接下来N行每行一个字符串Si。接下来M行每行一个字符串表示询问。
输出格式
对于每个询问,输出一个整数表示答案
样例输入
3 2
ab
bc
abc
abc
efg
样例输出
2
0
思路:
用scanf !=EOF最后一组不知道为什么就是会RE
虐狗宝典字典树笔记:
Trie树,字典树每个节点拥有若干个字符指针,在插入或检索字符串时扫到一个字符c就沿着当前节点的c字符指针走下去。
初始时,空Trie仅包含一个根节点,字符指针均为空。
插入S时,我们令一个指针p指向根节点,依次扫描S中的每一个字符c。
1.若p的c字符指针指向一个已经存在的节点Q,则令P=Q
2.若p的c字符指针指向空,则新建一个节点Q,令p的c字符指针指向Q,然后令P=Q
当S扫描完毕,当前节点P上标记他是一个字符串的末尾
检索S是否在Trie中存在,令一个指针P指向根节点,依次扫描S中的每个字符c
1.若P的c字符指针指向空,则说明S没有被插入过Trie,结束检索
2.若P的c字符指针指向一个已经存在的节点Q,则令P=Q
当S中的字符扫描完毕,若当前节点P被标记为一个字符串的末尾,说明S在Trie中存在。
本题与讲解的不同之处在于末尾应标记出现的次数,检索时也应该同时统计所经过节点的作为末尾的次数。
#include <iostream>
#include <set>
#include <cmath>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
typedef long long LL;
#define inf 0x7f7f7f7f int n, m;
const int maxn = 1e6 + ;
int trie[maxn][], tot = , ed[maxn];
char s[maxn]; void insertt(char *str)
{
int len = strlen(str), p = ;
for(int k = ; k < len; k++){
int ch = str[k] - 'a';
if(trie[p][ch] == ){
trie[p][ch] = ++tot;
}
p = trie[p][ch];
}
ed[p]++;
} int searchh(char* str)
{
int ans = ;
int len = strlen(str), p = ;
for(int k = ; k < len; k++){ p = trie[p][str[k] - 'a'];
if(p == )return ans;
ans += ed[p];
}
//ans += ed[p];
return ans;
} int main()
{
scanf("%d%d", &n, &m); for(int i = ; i <= n; i++){
scanf("%s", s);
insertt(s);
}
for(int j = ; j <= m; j++){
scanf("%s", s);
printf("%d\n", searchh(s));
}
return ;
}
CH601后缀数组【Trie树】的更多相关文章
- 从Trie树到双数组Trie树
Trie树 原理 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,能在常数时间O(len)内实现插入和查 ...
- [转]双数组TRIE树原理
原文名称: An Efficient Digital Search Algorithm by Using a Double-Array Structure 作者: JUN-ICHI AOE 译文: 使 ...
- 双数组Trie树 (Double-array Trie) 及其应用
双数组Trie树(Double-array Trie, DAT)是由三个日本人提出的一种Trie树的高效实现 [1],兼顾了查询效率与空间存储.Ansj便是用DAT(虽然作者宣称是三数组Trie树,但 ...
- Ansj分词双数组Trie树实现与arrays.dic词典格式
http://www.hankcs.com/nlp/ansj-word-pairs-array-tire-tree-achieved-with-arrays-dic-dictionary-format ...
- 双数组trie树的基本构造及简单优化
一 基本构造 Trie树是搜索树的一种,来自英文单词"Retrieval"的简写,可以建立有效的数据检索组织结构,是中文匹配分词算法中词典的一种常见实现.它本质上是一个确定的有限状 ...
- python Trie树和双数组TRIE树的实现. 拥有3个功能:插入,删除,给前缀智能找到所有能匹配的单词
#coding=utf- #字典嵌套牛逼,别人写的,这样每一层非常多的东西,搜索就快了,树高26.所以整体搜索一个不关多大的单词表 #还是O(). ''' Python 字典 setdefault() ...
- 双数组Trie树(DoubleArrayTrie)Java实现
http://www.hankcs.com/program/java/%E5%8F%8C%E6%95%B0%E7%BB%84trie%E6%A0%91doublearraytriejava%E5%AE ...
- 【XSY1551】往事 广义后缀数组 线段树合并
题目大意 给你一颗trie树,令\(s_i\)为点\(i\)到根的路径上的字符组成的字符串.求\(max_{u\neq v}(LCP(s_u,s_v)+LCS(s_u,s_v))\) \(LCP=\) ...
- BZOJ 1396: 识别子串( 后缀数组 + 线段树 )
这道题各位大神好像都是用后缀自动机做的?.....蒟蒻就秀秀智商写一写后缀数组解法..... 求出Height数组后, 我们枚举每一位当做子串的开头. 如上图(x, y是height值), Heigh ...
随机推荐
- python读写word文档
读: from docx import Document dir_docx = 'F:\Eclipse\workspace\Spider\cnblogs_doc\mytest - 副本.docx' d ...
- 图像处理之3d算法----2d转3d算法介绍
http://www.3dov.cn/html/c/37/index.html http://news.ifeng.com/a/20151117/46275220_0.shtml 磁力矩阵 http: ...
- (转)基于live555的流媒体代理转发服务器
对于并发量并不大而且对性能要求不是很高的流媒体传输模块,live555还是很好的选择,下面说一下我所实现的流媒体代理服务器(目前只能实现对H264单视频的转发)代理转发主要 对于并发量并不大而且对性能 ...
- erlang和java的socket通讯----最简单,初次实现。
直接上源码,留做纪念. 有点简单,大家不要笑,初次实现. 功能描述:java发送数据给erlang,erlang将收到的数据重复两次再发送给java. erlang源码:模块tcp_listen -m ...
- Fastqc 碱基质量分布图
横坐标代表每个每个碱基的位置,反映了读长信息,比如测序的读长为150bp,横坐标就是1到150: 纵坐标代表碱基质量值, 图中的箱线图代表在每个位置上所有碱基的质量值分布, 中间的红线代表的是中位数 ...
- 用IFrame作预览pdf,图片
<iframe id="my_img" src="@ViewBag.path" width="100%" frameborder=&q ...
- PHP清除HTML代码、空格、回车换行符的函数
清除HTML代码.空格.回车换行符的函数如下 function DeleteHtml($str) { $str = trim($str); $str = strip_tags($str,"& ...
- C++ string(转)
C++中string是标准库中一种容器,相当于保存元素类型为char的vector容器(自己理解),这个类提供了相当丰富的函数来完成对字符串操作,以及与C风格字符串之间转换,下面是对string一些总 ...
- opencascade读取iges并用vtk离散的一些问题
近期抽时间在弄iges文件内容读取的工作.然后将其离散化在vtk中能够显示处理以及兴许的一些工作.主要目的是识别CAD文件导出的模型,然后进行离散处理.方便兴许的处理.离散工作比較简单.opencas ...
- Java精选笔记_EL表达式
EL表达式 初始EL EL是一种可以简化JSP页面的表达式,EL表达式的语法非常简单都是以"${"符号开始,以"}"符号结束的 EL表达式是一种简单的数据&qu ...