度熊的字典
2016-07-14 14:15
218 查看
题目描述
度熊手上有一本神奇的字典,你可以在它里面做如下三个操作:
1、insert : 往神奇字典中插入一个单词
2、delete: 在神奇字典中删除所有前缀等于给定字符串的单词
3、search: 查询是否在神奇字典中有一个字符串的前缀等于给定的字符串
输入
这里仅有一组测试数据。第一行输入一个正整数N,代表度熊对于字典的操作次数,接下来N行,每行包含两个字符串,中间中用空格隔开。第一个字符串代表了相关的操作(包括: insert, delete 或者 search)。第二个字符串代表了相关操作后指定的那个字符串,第二个字符串的长度不会超过30。第二个字符串仅由小写字母组成。
输出
对于每一个search 操作,如果在度熊的字典中存在给定的字符串为前缀的单词,则输出Yes 否则输出 No。
样例输入
5
insert hello
insert hehe
search h
delete he
search hello
样例输出
Yes
No
提示
1≤N≤100000 第二个字符串的长度不会超过30
我恨trie树。。。离考试结束20分钟才发现原来的程序有问题,一通乱改还是回天乏术,据说暴力都有八九十,而我直接爆0。。。longpo的数据什么时候才能变强啊。。。
度熊手上有一本神奇的字典,你可以在它里面做如下三个操作:
1、insert : 往神奇字典中插入一个单词
2、delete: 在神奇字典中删除所有前缀等于给定字符串的单词
3、search: 查询是否在神奇字典中有一个字符串的前缀等于给定的字符串
输入
这里仅有一组测试数据。第一行输入一个正整数N,代表度熊对于字典的操作次数,接下来N行,每行包含两个字符串,中间中用空格隔开。第一个字符串代表了相关的操作(包括: insert, delete 或者 search)。第二个字符串代表了相关操作后指定的那个字符串,第二个字符串的长度不会超过30。第二个字符串仅由小写字母组成。
输出
对于每一个search 操作,如果在度熊的字典中存在给定的字符串为前缀的单词,则输出Yes 否则输出 No。
样例输入
5
insert hello
insert hehe
search h
delete he
search hello
样例输出
Yes
No
提示
1≤N≤100000 第二个字符串的长度不会超过30
我恨trie树。。。离考试结束20分钟才发现原来的程序有问题,一通乱改还是回天乏术,据说暴力都有八九十,而我直接爆0。。。longpo的数据什么时候才能变强啊。。。
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; int t,x,j,len,tot; char s[10],a[35]; int b[35]; struct ty { int Next[26]; int cnt; void init() { memset(Next,-1,sizeof(Next)); cnt=0; } }p[1000005]; void insert(char *s) { x=0; len=strlen(s); for(int i=0;i<len;i++) { j=s[i]-'a'; if(p[x].Next[j]==-1) { tot++; p[tot].init(); p[x].Next[j]=tot; } x=p[x].Next[j]; p[x].cnt++; } } void Delete(char *s) { x=0; len=strlen(s); int k=0; for(int i=0;i<len;i++) { j=s[i]-'a'; if(p[x].Next[j]==-1) return; x=p[x].Next[j]; k++; b[k]=x; if(p[x].cnt==0) return; } int d=p[x].cnt; for(int i=1;i<=k;i++) p[b[i]].cnt=p[b[i]].cnt-d; p[x].init(); } int search(char *s) { x=0; len=strlen(s); for(int i=0;i<len;i++) { j=s[i]-'a'; if(p[x].Next[j]==-1) return 0; x=p[x].Next[j]; if(p[x].cnt==0) return 0; } return 1; } int main() { p[0].init(); cin>>t; while(t--) { scanf("%s",s); if(s[0]=='i') { scanf("%s",a); insert(a); } if(s[0]=='d') { scanf("%s",a); Delete(a); } if(s[0]=='s') { scanf("%s",a); if(search(a)) printf("Yes\n");else printf("No\n"); } } return 0; }
相关文章推荐
- 虚函数和纯虚函数的区别
- mac IDEA 快捷键
- HDU4833 Best Financing (DP)
- 查找
- ios 调试过程捕获异常Stack 信息
- PAT 团体程序设计天梯赛-练习集 L1-020. 帅到没朋友
- linux中du和df 的区别
- Unity3D功能嵌入到Android上
- The Heads-Up Grid 让你的HTML页面具有辅助线网格功能
- spring开发:spring的作用域(scope="prototype";scope="singleton")
- VC理论
- Mysql获得当前日期的前一个月的最后一天
- Power of Four
- DDR2 DDR3 constraint & ac check note of SDCTRL Verification
- 获取Android手机的Mac地址的工具类
- JBAS014775: New missing/unsatisfied dependencies
- localStorage请使用getItem 和setITem
- network: Android 网络判断(wifi、3G与其他)
- 通过history.pushState无刷新改变url
- Emeditor V14注册码