hdu2846 Repository 字典树(好题)
把每个字符串的所有子串都加入字典树,但在加入时应该注意同一个字符串的相同子串只加一次,因此可以给字典树的每个节点做个记号flag--表示最后这个前缀是属于那个字符串,如果当前加入的串与它相同,且二者属于不同串就自加,否则不作处理。
AC代码:
#include<cstdio>
#include<cstring>
const int Max=26;
struct node{
node *next[Max];
int cnt,num; //用num记录最后一次加入的字符串编号,若不同串则自加
node(){
for(int i=0;i<26;++i) next[i]=NULL;
cnt=num=0;
}
}*root;
void insert_tree(int num,char *s,int n){
node *p=root,*q;
for(int i=0;i<n;++i){
int u=s[i]-'a';
if(p->next[u]==NULL){
q=new node();
q->cnt=1;
q->num=num;
p->next[u]=q;
p=p->next[u];
}
else{
if(num!=p->next[u]->num) {
p->next[u]->cnt++;
p->next[u]->num=num;
}
p=p->next[u];
}
}
}
int getAns(char *s){
int n=strlen(s);
node *p=root;
for(int i=0;i<n;++i){
int u=s[i]-'a';
if(p->next[u]==NULL) return 0;
p=p->next[u];
}
return p->cnt;
}
void free_tree(node *u){
if(u==NULL) return;
for(int i=0;i<26;++i) free_tree(u->next[i]);
delete u;
}
int main(){
int n,m;
char s[40],s1[40];
scanf("%d",&n);
root=new node();
for(int i=0;i<n;++i){
scanf("%s",s);
int len=strlen(s);
for(int j=0;j<len;++j){
int c=0;
for(int k=j;k<len;++k) s1[c++]=s[k];
s1[c]='\0';
insert_tree(i,s1,c);
}
}
scanf("%d",&m);
for(int i=0;i<m;++i) {
scanf("%s",s);
printf("%d\n",getAns(s));
}
free_tree(root);
return 0;
}
如有不当之处欢迎指出!
hdu2846 Repository 字典树(好题)的更多相关文章
- 字典树模板题(统计难题 HDU - 1251)
https://vjudge.net/problem/HDU-1251 标准的字典树模板题: 也注意一下输入方法: #include<iostream> #include<cstdi ...
- CH 1601 - 前缀统计 - [字典树模板题]
题目链接:传送门 描述给定 $N$ 个字符串 $S_1,S_2,\cdots,S_N$,接下来进行 $M$ 次询问,每次询问给定一个字符串 $T$,求 $S_1 \sim S_N$ 中有多少个字符串是 ...
- HDU 1251 统计难题(字典树模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意:给出一些单词,然后有多次询问,每次输出以该单词为前缀的单词的数量. 思路: 字典树入门题. #inc ...
- hdu1305 字典树水题
题意: 给你一些字符串,然后问你他们中有没有一个串是另一个串的前缀. 思路: 字典树水题,(这种水题如果数据不大(这个题目不知道大不大,题目没说估计不大),hash下也行,把每个 ...
- hdu 1251 统计难题 (字典树入门题)
/******************************************************* 题目: 统计难题 (hdu 1251) 链接: http://acm.hdu.edu. ...
- HDU1251 字典树板子题
题意:中文题,统计以某字符串作为前缀的字符串个数 刚学字典树,理解起来十分简单,就是维护一个多叉树,这里用的是链表版本,后面就用的是数组版本了,个人更喜欢数组版本,这里的链表版本就因为 莫名其妙的错误 ...
- hdu 1251 统计难题 字典树第一题。
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submi ...
- HDU-4825 Xor Sum,字典树好题!
Xor Sum 一遍A了之后大呼一声好(keng)题!debug了两小时~~~~百度之星资格赛,可以. 题意:给你一个n个元素的数组,m次查询,每次输入一个数k要求从数组中找到一个数与k异或值最大,输 ...
- HDU 2846 Repository (字典树 后缀建树)
Repository Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
随机推荐
- 从零认识Java Package
Java Package为何被设计?如果你没想过,我这里或许可以提供一种视角. 想象一下,作为一个语言的设计者,你一定会考虑一个问题:变量名的冲突.为了解决这个问题,C++引入了命名空间(namesp ...
- CentOS之7与6的区别
前言 centos7与6之间最大的差别就是初始化技术的不同,7采用的初始化技术是Systemd,并行的运行方式,除了这一点之外,服务启动.开机启动文件.网络命令方面等等,都说6有所不同.让我们先来了解 ...
- C# 取值函数
C# 中取绝对值的函数 System.Math.Abs(float value); System.Math.Abs(decimal value);System.Math.Abs(int value); ...
- [UWP]合体姿势不对的HeaderedContentControl
1. 前言 HeaderedContentControl是WPF中就存在的控件,这个控件的功能很简单:提供Header和Content两个属性,在UI上创建两个ContentPresenter并分别绑 ...
- elasticsearch-5.x JAVA API(001)
Elasticsearch JAVA API 极其广泛,把所有的方法意义介绍出来显然不太现实.从1.x到2.x,在到5.x,最后到6.0,也不过短短两三年的时间,我挑选了5.4.0版本分三部分把平时常 ...
- Python基础篇(五)
bool用于判断布尔值的结果是True还是False >>> bool("a") True >>> bool(3) True >>& ...
- 序列化和反序列化及Protobuf 基本使用
序列化和反序列化 序列化和反序列化在平常工作中会大量使用,然而并不一定非常清楚它的概念.序列化和反序列化的选型却是系统设计或重构一个重要的环节,在分布式.大数据量系统设计里面更为显著.机器间的通信需要 ...
- [Lucas定理]【学习笔记】
Lucas定理 [原文]2017-02-14 [update]2017-03-28 Lucas定理 计算组合数取模,适用于n很大p较小的时候,可以将计算简化到小于p $ \binom{n}{m} \m ...
- Uva 11077 Find the Permutations [置换群 DP]
题意: 给定$n$和$k$,问有多少排列交换$k$次能变成升序 $n \le 21$ $uva$貌似挂掉了$vjudge$上一直排队 从某个排列到$1,2,...,n$和从$1,2,...,n$到某个 ...
- git恢复误删除文件
在git仓库管理下误删除文件一般会分为以下3种情况: 1.手动直接删掉,如选择-右击-删除 这种删除未修改本地仓库[版本库],只修改了工作区,直接git checkout -- fileName即可恢 ...