码迷,mamicode.com
首页 > 其他好文 > 详细

[HDU5687]2016"百度之星" - 资格赛 Problem C

时间:2017-08-15 15:59:44      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:new   problem   clu   color   puts   arc   ble   情况   nod   

题目大意:有n个操作,每个操作是以下三个之一,要你实现这些操作。

1、insert : 往字典中插入一个单词
2、delete: 在字典中删除所有前缀等于给定字符串的单词
3、search: 查询是否在字典中有一个字符串的前缀等于给定的字符串

解题思路:Trie树即可。

注意代码第49行的判断,我当时以为只要成功搜到这个前缀就一定有答案,忽略了删除操作使某些前缀的单词数为0的情况。

C++ Code:

#include<cstdio>
struct node{
	int cnt;
	node* nxt[27];
	node():cnt(0){for(int i=0;i<26;++i)nxt[i]=NULL;}
}*d;
char s[40];
void ins(char* s){
	++d->cnt;
	node *now=d;
	for(int i=0;s[i];++i){
		int v=s[i]-‘a‘;
		if(now->nxt[v]==NULL)now->nxt[v]=new node;
		now=now->nxt[v];
		++now->cnt;
	}
}
void clear(node* p){
	for(int i=0;i<26;++i)
	if(p->nxt[i]!=NULL)clear(p->nxt[i]);
	delete p;
}
void del(char* s){
	node* p=d,*pre=p;
	int v;
	for(int i=0;s[i];++i){
		v=s[i]-‘a‘;
		if(p->nxt[v]==NULL)return;
		pre=p;
		p=p->nxt[v];
	}
	int num=p->cnt;
	clear(p);
	pre->nxt[v]=NULL;
	p=d;
	for(int i=0;;++i){
		p=p->nxt[s[i]-‘a‘];
		if(p==NULL)break;
		p->cnt-=num;
	}
}
bool ask(char* s){
	node* p=d;
	for(int i=0;s[i];++i){
		int v=s[i]-‘a‘;
		p=p->nxt[v];
		if(p==NULL)return false;
	}
	if(p->cnt<1)return false;
	return true;
}
int main(){
	d=new node;
	int n;
	scanf("%d",&n);
	while(n--){
		scanf("%s",s);
		if(s[0]==‘i‘){
			scanf("%s",s);
			ins(s);
		}else
		if(s[0]==‘d‘){
			scanf("%s",s);
			del(s);
		}else{
			scanf("%s",s);
			if(ask(s))puts("Yes");else
			puts("No");
		}
	}
	return 0;
}

 

[HDU5687]2016"百度之星" - 资格赛 Problem C

标签:new   problem   clu   color   puts   arc   ble   情况   nod   

原文地址:http://www.cnblogs.com/Mrsrz/p/7365372.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!