hdu 5687 Problem C
来源:互联网 发布:手机切换软件不掉线 编辑:程序博客网 时间:2024/04/28 07:46
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
度熊手上有一本神奇的字典,你可以在它里面做如下三个操作:
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
自己思路:删除时,把没有单词的节点全部删除(节点没有必要删除,因为以后也可以用到这个节点)。大神思路:用num记录以当时节点为前缀的单词数,删除时就不用删除节点,只需要改变num,省时省空间,搜索时也是看num值。
字典树基础题,第一次敲字典树:
#include <iostream>#include<string.h>#include<stdio.h>#define siz 500005using namespace std;int Trie[siz][27],sz,val[siz];char str1[15],str2[35];void Insert(char *s){ int u=0,j; for(int i=0; s[i]; i++) { j=s[i]-'a'; if(!Trie[u][j]) { val[sz]=0; Trie[u][j]=sz++; } u=Trie[u][j]; } val[u]=1;}bool Search(char *s){ int u=0,j; for(int i=0; s[i]; i++) { j=s[i]-'a'; if(!Trie[u][j]) return false; u=Trie[u][j]; } return true;}void Delete(char *s){ int u=0,j,preu[35],prej[35],r=0; preu[0]=0; for(int i=0; s[i]; i++) { j=s[i]-'a'; prej[r]=j; if(!Trie[u][j]) return; u=Trie[u][j]; preu[++r]=u; } memset(Trie[u],0,sizeof(Trie[u])); for(int i=r-1; i>=0; i--) { u=preu[i], j=prej[i]; Trie[u][j]=0; if(val[u]) return; for(int t=0; t<27; t++) if(Trie[u][t]) return; }}int main(){ int n; sz=1; scanf("%d",&n); for(int t=1; t<=n; t++) { scanf("%s %s",str1,str2); if(str1[0]=='i') { Insert(str2); } if(str1[0]=='s') { if(Search(str2)) { cout<<"Yes"<<endl; } else { cout<<"No"<<endl; } } if(str1[0]=='d') { Delete(str2); } } return 0;}
0 0
- HDU 5687 Problem C
- HDU - 5687 Problem C
- hdu 5687 Problem C
- hdu 5687 Problem C 字典树
- HDU 5687 Problem C(字典树)
- HDU-5687 Problem C(2016"百度之星"-资格赛)
- 字典树——HDU 5687 problem c
- Problem C hdu 1213 How Many Tables
- HDU 1000 A+B Problem C/C++
- HDU 1001 Sum Problem C/C++
- HDU 5687 Problem C (2016年百度之星资格赛C题)
- HDU-PROBLEM
- 【暑期基础3】C HDU 2055 An easy problem
- HDU-1016-Prime Ring Problem( C && 经典DFS题 )
- hdu 检测赛 Problem C(状压dp)
- Problem C
- Problem C
- Problem C
- C++Primer第五版 第三章习题答案(1~10)
- 初试Unity 3D——刚体与碰撞体的比较
- 字节流与字符流的区别详解
- Oracle建DataBase的时候报监听错误信息
- 云计算初探2-使用云服务器快速搭建论坛
- hdu 5687 Problem C
- mybatis 报错: Caused by: org.apache.ibatis.type.TypeException: JDBC requires that the Jdbc
- gcc 编译过分析
- Kafka Consumer
- ubuntu 14.04 server install gitolite V3.6.6
- H.266:四抽头帧内内插滤波器
- QSetting配置文件中的存储和读取的简单应用
- 一些小技巧
- PHP 十六大魔术方法学习