2016"百度之星" - 资格赛(Astar Round1)Problem C

来源:互联网 发布:黑页源码 编辑:程序博客网 时间:2024/05/18 01:27

Problem C

 
 Accepts: 328
 
 Submissions: 3058
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 131072/131072 K (Java/Others)
Problem Description

度熊手上有一本神奇的字典,你可以在它里面做如下三个操作:

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

这里仅有一组测试数据。第一行输入一个正整数N (1\leq N\leq 100000)N(1N100000),代表度熊对于字典的操作次数,接下来NN行,每行包含两个字符串,中间中用空格隔开。第一个字符串代表了相关的操作(包括: insert, delete 或者 search)。第二个字符串代表了相关操作后指定的那个字符串,第二个字符串的长度不会超过30。第二个字符串仅由小写字母组成。

Output

对于每一个search 操作,如果在度熊的字典中存在给定的字符串为前缀的单词,则输出Yes 否则输出 No。

Sample Input
5insert helloinsert hehesearch hdelete hesearch hello
Sample Output
Yes

No

什么都不用说 字典树模板题 只是多加了删除操作而已 其实删除操作也是极其简单的 在字典数中 插入 查找 删除的代码相似度非常高 所以不存在太难的地方

#include <stdio.h>  #include <string.h>  typedef struct node{      int num;      node *next[30];      node(){          memset(next,0,sizeof(next));          num=0;  //值得一学的好处理方法 简单实用 初始化节点的漂亮代码     }  }Trie;  char dir[32],s[32];  void Insert(node *root,char *s){      node *p=root;      for(int i=0; s[i]; i++){          int x=s[i]-'a';          if(p->next[x]==NULL) p->next[x]=new node;          p=p->next[x];          p->num++;     }  }  int Search(node *root,char *s){      node *p=root;      for(int i=0;s[i];i++){          int x=s[i]-'a';          if(p->next[x]==NULL) return 0;          p=p->next[x];      }      return p->num;  }  void Delete(node *root,char *s,int cnt){      node *p=root;      for(int i=0;s[i];i++){          int x=s[i]-'a';          p=p->next[x];          p->num-=cnt;  //删除节点的操作无非就是把当前前缀开头单词数减掉     }      for(int i=0;i<30;i++)p->next[i]=0;  //再把之后所有的孩子一律杀死(吼吼 好残忍) }    int main(){      int n;      scanf("%d",&n);      Trie *root=new node;      while(n--){          scanf("%s %s",dir,s);           if(dir[0]=='i'){  //巧妙处理 不用整个串匹配 系统给的指令一定很标准 判定首字母即可             Insert(root,s);          }else if(dir[0]=='s'){              int ans=Search(root,s);              if(ans) printf("Yes\n");            else    printf("No\n");        }else{              int cnt=Search(root,s);              if(cnt) Delete(root,s,cnt);          }      }      return 0;  }  


0 0