HDOJ5687 字典树模板,数组实现

Problem C

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1673    Accepted Submission(s): 482


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

  1、insert : 往神奇字典中插入一个单词

  2、delete: 在神奇字典中删除所有前缀等于给定字符串的单词

  3、search: 查询是否在神奇字典中有一个字符串的前缀等于给定的字符串
 

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

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

Sample Input
 
   
5 insert hello insert hehe search h delete he search hello
 

Sample Output
 
   
Yes No
 

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

Recommend
liuyiding   |   We have carefully selected several similar problems for you:   6107  6106  6105  6104  6103 


题意大家都懂的,就是个很裸的字典树题目。现在用数组写一个模板程序,供参考。
#include 
#include 
#include 
#include 
#include 
using namespace std;

const int maxn =3e6+10; //命令行数是100000,字符串长度不超过30,上限就是3e6
struct node {
      int next[26]; //只考虑小写字母的情况,大写的话扩大到52,有数字的话扩大到62
      int sum;
      void init(){
          sum=0;
          memset(next,-1,sizeof(next));
      }
};
node word[maxn];
int tot=0;

void add(char a[], int len){
    int now=0;
    for (int i=0; i>n;
    tot=1;
    while (n--){
        cin>>str>>s;
        if (str[0]=='s'){
              int ans=query(s,strlen(s));
              if (ans) cout<<"Yes"<


你可能感兴趣的:(字典树)