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下启动/重启/停止apache服务器
Task: Start Apache 2 Server /启动apache服务# /etc/init.d/apache2 startor$ sudo /etc/init.d/apache2 start ...
- web开发之微信公众号---微信公众好开发
--------------------------------------time:2015/11/5 ----------------------------------------------- ...
- java中关于二进制的初步。
两个int型和一个long型的转换: long now=1368257088802L; int low = (int) (0xFFFFFFFFL & now) ...
- tarjan算法-解决有向图中求强连通分量的利器
小引 看到这个名词-tarjan,大家首先想到的肯定是又是一个以外国人名字命名的算法.说实话真的是很佩服那些算法大牛们,佩服得简直是五体投地啊.今天就遇到一道与求解有向图中强连通分量的问题,我的思路就 ...
- Cookie管理工具
Cookie Editor 是管理 Cookie 的工具,能识别并编辑IE.Firfox.Netscope Cookie 文件,控制个人隐私信息,修改 Cookie 使用期限,删除历史文件,编辑和删除 ...
- SVN目录权限配置
1.如果要使用SVN,需要有一个项目的保存目录,例如把该目录设为“C:\MyPro”文件夹 2.把该目录发布为SVN项目目录,则需要通过以下命令行 svnadmin create c:\mypro ...
- 在php代码中调用帝国cms头部变量temp.header的方法
在php代码中调用帝国cms头部变量temp.header的方法 代码如下: <?php require("../e/class/connect.php"); if(!def ...
- day27<反射&JDK5新特性>
反射(类的加载概述和加载时机) 反射(类加载器的概述和分类) 反射(反射概述) 反射(Class.forName()读取配置文件举例) 反射(通过反射获取带参构造方法并使用) 反射(通过反射获取成员变 ...
- 上传绕过WAF的tips大全
原始默认状态: ——WebKitFormBoundary2smpsxFB3D0KbA7D Content-Disposition: form-data; name=”filepath”; filena ...
- Python 进阶(一)函数式编程
来自慕课网: 简介: 函数:function ,在入门课程已学 函数式:functional,一种编程范式 函数式编程是一种抽象计算的编程模式,函数≠函数式,好比:计算≠计算机