您的位置:首页 > 其它

HDU 5687 字典树插入查找删除

2016-05-16 23:55 429 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5687

2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解

#include<stdio.h>
#include<string.h>
struct node{
int next[27];
int cnt;
void init(){
cnt = 0;//计数
memset(next,-1,sizeof(next));
}
};
struct node trie[4444444];
int tot = 0;//记录节点数

void insert(char *s){
int cur = 0,len = strlen(s);
for(int i = 0;i<len;i++){
int temp = s[i]-'a';
int next = trie[cur].next[temp];
if(next == -1){
next = ++tot;
trie[next].init();
trie[cur].next[temp] = next;
}
cur = next;
trie[cur].cnt++;
}
}
int find(char *s){
int cur = 0,len = strlen(s);
for(int i = 0;i<len;i++){
int temp = s[i]-'a';
int next = trie[cur].next[temp];
if(next == -1)
return 0;
cur = next;
}
return trie[cur].cnt>0;//注意
}
void del(char *s){
int cur = 0,late,len = strlen(s);
//这里特判一下要删除的字符串是否存在
for(int i=0;i<len;i++){
int tmp=s[i]-'a';
int next=trie[cur].next[tmp];
if(next==-1) return;
late = cur;
cur=next;
}
cur = 0;
for(int i = 0;i<len;i++){
int temp = s[i]-'a';
int next = trie[cur].next[temp];
late = cur;
cur = next;
trie[cur].cnt--;
}
trie[cur].init();
int temp = s[len-1]-'a';
trie[late].next[temp] = -1;
}
int main(){
int n;
scanf("%d",&n);
char op[33],s[33];
trie[0].init();
while(n--){
scanf(" %s %s",op,s);
if(op[0] == 'i'){
insert(s);
}else if(op[0] == 's'){
if(find(s))
puts("Yes");
else
puts("No");
}else{
del(s);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: