Problem C

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1423    Accepted Submission(s): 426

Problem Description
度熊手上有一本神奇的字典,你可以在它里面做如下三个操作:

1、insert : 往神奇字典中插入一个单词

2、delete: 在神奇字典中删除所有前缀等于给定字符串的单词

3、search: 查询是否在神奇字典中有一个字符串的前缀等于给定的字符串

 
Input
这里仅有一组测试数据。第一行输入一个正整数N(1≤N≤100000),代表度熊对于字典的操作次数,接下来N行,每行包含两个字符串,中间中用空格隔开。第一个字符串代表了相关的操作(包括: insert, delete 或者 search)。第二个字符串代表了相关操作后指定的那个字符串,第二个字符串的长度不会超过30。第二个字符串仅由小写字母组成。
 
Output
对于每一个search 操作,如果在度熊的字典中存在给定的字符串为前缀的单词,则输出Yes 否则输出 No。
 
Sample Input
5
insert hello
insert hehe
search h
delete he
search hello
 
Sample Output
Yes
No
 
Source
 算是trie的入门级题目吧,也是第一次做字典树,搞了好久。
一开始每个node分一个bool变量总感觉可以,后发现操作都是对前缀而言,并没有精确到某一个词,所以换成了int方便统计。
例节点root->a->p->p的值为x,就表示app为前缀的词的数量,在insert和delete时维护这个变量、
还有就是指针的操作,又被搞迷糊一直RE,例如 node *p1=new node(),*p2=new node();
p1->child=p2;  这时如果令p2=NULL,则p1->child并不会变为NULL,这时显然的吧,,,,只是p1->child和p2指向了同一处内存而已,内存没有delete,
p1->child也不会受到影响。同理如果delete  p2,则p2指向的内存被释放,p1->child指向的这块也是被释放的内存了。
#include<bits/stdc++.h>
using namespace std;
struct node
{
int have;
node *child[];
node(){have=;for(int i=;i<;++i) child[i]=NULL;}
};
node *root;
void release(node *p)
{
if(p==NULL) return;
for(int i=;i<;++i){
if(p->child[i]!=NULL) release(p->child[i]);
}
delete p;
}
void Insert(char *s)
{
node *p=root;
int n1=strlen(s);
for(int i=;i<n1;++i){int t=s[i]-'a';
if(p->child[t]==NULL)
p->child[t]=new node();
p=p->child[t];
p->have++;
}
} void Delete(char *s)
{ node *p=root,*pre=p;
int n1=strlen(s),t,num=;
for(int i=;i<n1;++i){ t=s[i]-'a';
if(p->child[t]==NULL) return;
pre=p;
p=p->child[t];
}num=p->have;
release(p);
pre->child[t]=NULL;
p=root;
for(int i=;i<n1-;++i){
p=p->child[s[i]-'a'];
p->have-=num;
}
}
bool Search(char *s)
{
node *p=root;
int n1=strlen(s);
for(int i=;i<n1;++i){
int t=s[i]-'a';
if(p->child[t]==NULL) return ;
p=p->child[t];
}
if((p->have)<) return ;
return ;
}
int main()
{
int N,i,j;
char s1[],s2[];
cin>>N;
root=new node();
while(N--){
scanf("%s%s",s1,s2);
if(!strcmp(s1,"insert")){
Insert(s2) ;
}
else if(!strcmp(s1,"delete")){
Delete(s2);
}
else if(!strcmp(s1,"search")){
Search(s2)?puts("Yes"):puts("No");
}
}release(root);
return ;
}

HDU 5687 字典树入门的更多相关文章

  1. HDU 5687 字典树插入查找删除

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5687 2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解 #include< ...

  2. hdu 1247 (字典树入门)

    Hat’s Words Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  3. hdu 1251 统计难题 (字典树入门题)

    /******************************************************* 题目: 统计难题 (hdu 1251) 链接: http://acm.hdu.edu. ...

  4. HDU 4825 Xor Sum(01字典树入门题)

    http://acm.hdu.edu.cn/showproblem.php?pid=4825 题意: 给出一些数,然后给出多个询问,每个询问要从之前给出的数中选择异或起来后值最大的数. 思路:将给出的 ...

  5. HDU 1251 统计难题(字典树入门模板题 很重要)

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

  6. HDU 5384 字典树、AC自动机

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5384 用字典树.AC自动机两种做法都可以做 #include<stdio.h> #includ ...

  7. hdu 2112(字典树+最短路)

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. hdu 2072(字典树模板,set,map均可做)

    地址:http://acm.hdu.edu.cn/showproblem.php?pid=2072 lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词 ...

  9. Chip Factory HDU - 5536 字典树(删除节点|增加节点)

    题意: t组样例,对于每一组样例第一行输入一个n,下面在输入n个数 你需要从这n个数里面找出来三个数(设为x,y,z),找出来(x+y)^z(同样也可以(y+z)^1)的最大值 ("^&qu ...

随机推荐

  1. python全栈开发从入门到放弃之socket并发编程之协程

    一.为什么会有协程 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情 ...

  2. 跨域问题-nginx代理

    有时候我们跨域是借助了浏览器对 Access-Control-Allow-Origin 的支持.但有些浏览器是不支持的,所以这并非是最佳方案现在我们来利用nginx 通过反向代理 满足浏览器的同源策略 ...

  3. springCloud--1

    电影微服务是服务消费者,用户微服务是服务提供者. Springcloud对eureka的支持很好,eureka本身是一个基于REST的服务, Eureka里面有一个注册表,Application Cl ...

  4. NUMA架构的优缺点

    numa把一台计算机分成多个节点(node),每个节点内部拥有多个CPU,节点内部使用共有的内存控制器,节点之间是通过互联模块进行连接和信息交互.因此节点的所有内存对于本节点所有的CPU都是等同的,对 ...

  5. Javascript中的函数数学运算

    1.Math函数与属性使用语法 Math.方法名(参数1,参数2,...); Math.属性; 说明 Math函数可以没有参数,比如Math.random()函数,或有多个参数,比如Math.max( ...

  6. Minor GC和Full GC区别(转)

    http://blog.csdn.net/u010796790/article/details/52213708   概念: 新生代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为 Ja ...

  7. [.net基础]访问修饰符

    标题:[.net基础]访问修饰符 一.前言 基础掌握不牢固啊,所以记录下来. 二.方法访问修饰符Internal (1).创建工程ParentAndSon (2).添加类ModelA namespac ...

  8. Koa源码解析

    Koa是一款设计优雅的轻量级Node.js框架,它主要提供了一套巧妙的中间件机制与简练的API封装,因此源码阅读起来也十分轻松,不论你从事前端或是后端研发,相信都会有所收获. 目录结构 首先将源码下载 ...

  9. linux ftp 简单搭建

    1.安装 yum install vsftpd 2.重启服务 /sbin/service vsftpd restartShutting down vsftpd: [ OK ]Starting vsft ...

  10. linux 第三周

    linux内核目录结构 arch目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录.PC机一 ...