字典树模板

1.用字典树实现
空间超额(MLE)的代码,还有更好更紧凑的字典树实现方法

#include<bits/stdc++.h>
using namespace std;
struct Trie{                                //字典树的定义 
    Trie* next[26];
    int num;                                //以当前字符串为前缀的单词的数量 
    Trie(){                                    //构建函数 
        for(int i=0;i<26;i++)    next[i]=NULL;
        num=0;
    }
};
Trie root;
void Insert(char str[]){                    //将字符插入字典树中 
    Trie *p=&root;
    for(int i=0;str[i];i++){                //遍历每一个字符 
        if(p->next[str[i]-'a']==NULL)        //如果该字符没有对应的结点 
            p->next[str[i]-'a']=new Trie;    //创建一个
        p=p->next[str[i]-'a'];
        p->num++;                            //(保证输入的每个单词都不一样) 
    }
}
int Find(char str[]){                        //返回以字符串为前缀的单词的数量 
    Trie* p=&root;
    for(int i=0;str[i];i++){                //在字典树中找到该单词的结尾位置 
        if(p->next[str[i]-'a']==NULL)
            return 0;
        p=p->next[str[i]-'a'];
    }
    return p->num;
} 
int main(){
    char str[11];
    while(gets(str)){
        if(!strlen(str))    break;            //输入了一个空行
        Insert(str);
    }
    while(gets(str))    cout<<Find(str)<<endl;
    return 0;
}

2.用map实现
这一题用map来做非常简单,代码如下:

#include<bits/stdc++.h>
using namespace std;
int main(){
    char str[10];
    map<string,int>m;
    while(gets(str)){
        int len=strlen(str);
        if(!len)    break;
        for(int i=len;i>0;i--){
            str[i]='\0';
            m[str]++;
        }
    }
    while(gets(str))    cout<<m[str]<<endl;
    return 0;
}
全部评论
不愧是杨大佬
点赞 回复 分享
发布于 2020-02-04 12:56
太强了,不愧是杨大佬
点赞 回复 分享
发布于 2020-02-04 12:55
爱了爱了 大佬的实力已经可以拿金牌了
点赞 回复 分享
发布于 2020-02-04 12:55

相关推荐

09-01 09:00
已编辑
四川旅游学院 运营
牛客55195891...:主要是专业不好,别的没毛病
牛客解忧铺
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务