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 ...
随机推荐
- ubuntu 系统网络突然"网络已禁用"
sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo servic ...
- css -- 通俗理解inline、block、inline-block
display:inline; 内联元素,简单来说就是在同一行显示. display:block; 块级元素,简单来说就是就是有换行,会换到第二行. display:inline-block; 就是在 ...
- HBase源代码分析之MemStore的flush发起时机、推断条件等详情
前面的几篇文章.我们具体介绍了HBase中HRegion上MemStore的flsuh流程,以及HRegionServer上MemStore的flush处理流程.那么,flush究竟是在什么情况下触发 ...
- JQuery 选择器 xpath 语法应用
比如下面html代码 <ul> <li class="aaaa" title="ttt">li-1</li> <li ...
- js中数组作为参数传递的定义
下面的函数实现了一个我们想要的最基本的图片预加载效果 function preloadimages(arr){ var newimages=[] var arr=(typeof arr!= ...
- Ubuntu 建立桌面快捷方式
非常多时候,在Ubuntu下软件能够通过命令安装.可是有时候比較方便的方法就是下载一个压缩包,解压就能够使用了. 可是每次使用都要先跳到解压文件夹.这就比較麻烦.所以能够通过创建桌面快捷方式来解决问题 ...
- 【渗透测试学习平台】 web for pentester -5.代码执行
Example 1 http://192.168.106.154/codeexec/example1.php?name=".system('uname -a');// Example 2 h ...
- docker rmi 详解
docker rmi 用于删除指定的镜像,常见用法如下: [root@localhost ~]$ docker rmi centos # 根据 REPOSITORY 来删除镜像 [root@local ...
- apache MINA之心跳协议运用
摘要 心跳协议,对基于CS模式的系统开发来说是一种比较常见与有效的连接检测方式,最近在用MINA框架,原本自己写了一个心跳协议实现,后来突然发现MINA本身带有这样一个心跳实现,感于对框架的小小崇拜, ...
- Keil MDK从未有过的详细使用讲解(转)
这博主关于MDK 的使用的文章,写的得TM的好 TM的实用! 真心收藏! 熟悉Keil C 51的朋友对于Keil MDK上手应该比较容易,毕竟界面是很像的.但ARM内核毕竟不同于51内核,因此无论 ...