您的位置:首页 > 其它

度熊的字典

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的数据什么时候才能变强啊。。。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: