您的位置:首页 > 其它

HIHO第二周-Trie树

2015-04-03 14:23 357 查看
题目:

点击打开链接

Trie树一般用于找有相同前缀的单词集合,可以用字符串补全等。这里有26个英文字母,所以建立的Trie树是26叉树。root节点不存储字符和计数。

在建树的同时,对经过的节点进行计数。

参考其他人的代码手打了一遍,加了一些注释。

解答

#include<iostream>
#include<string>
using namespace std;

typedef struct trie{
    int count;
    char c;
    struct trie* next[26];
}Trie;

int main(){
    //头结点不存储c和count
    Trie* root=new Trie;
    for(unsigned i(0);i<26;i++){
        root->next[i]=NULL;
    }
    int n,m;
    string s;
    cin>>n;
    while(n--){
        Trie* p=root;
        cin>>s;
        for(unsigned i(0);i<s.size();i++)
		{
            //哪一分支
            unsigned j=s[i]-'a';
            //不为空
            if(p->next[j])
            ++p->next[j]->count;
            else //新建结点
            {
                Trie* q=new Trie;
                q->count=1;
                q->c=s[i];
               for(unsigned k(0);k<26;k++){
                     q->next[k]=NULL;
                }
				p->next[j]=q;
            }
        p=p->next[j];
        }
    }

    cin>>m;
    while(m--){
        cin>>s;
        //标记是否存在于字典
        bool flag=false;
        Trie* p=root;
        for(unsigned i(0);i<s.size();i++){
            unsigned j=s[i]-'a';
            //为空,则不存在
            if(!p->next[j]){
                flag=true;
                break;
            }
            p=p->next[j];
        }
        
        if(flag) cout<<'0'<<endl;
        else cout<<p->count<<endl;
    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: