简单数据结构之字典树

发现漏了很多知识,处理完这个就去看看二叉树…
放个学习链接`点这里
整完这些再去补一补01字典树
要学的好多啊…
HDU1251统计难题
在这里插入图片描述

int tree[maxn][27];
int sum[maxn],tot;
void insert(char str[]){
    int pos=0;
    int root=0;
    while(str[pos]!='\0'){
        int id=str[pos]-'a'+1;
        if(tree[root][id]==0){
            tree[root][id]=++tot;
        }
        sum[tree[root][id]]++;
        pos++;
        root=tree[root][id];
    }
}
int query(char str[]){
    int pos=0,root=0;
    while(str[pos]!='\0'){
        int id=str[pos]-'a'+1;
        if(!tree[root][id]){
            return 0;
        } else {
            root = tree[root][id];
        }
        pos++;
    }
    return sum[root];
}
void solve(){
    tot=0,ms(tree,0),ms(sum,0);
    char str[15];
    while(gets(str)&&str[0]!='\0'){
        insert(str);
        //de(str);
    }
    while(gets(str)){
        printf("%d\n",query(str));
    }
}

HDU2072单词数
在这里插入图片描述
可含连续空格…我吐了

int tree[maxn][27];
int sum[maxn],tot;
char str[maxn];
void insert(string tmp){
    int sz=tmp.size();
    int root=0;
    for(int i=0;i<=sz-1;i++){
        int id=tmp[i]-'a'+1;
        if(!tree[root][id]){
            tree[root][id]=++tot;
        }
        root=tree[root][id];
        //sum[root]++;
    }
    sum[root]++;
}
bool check(string tmp){
    int sz=tmp.size();
    int root=0;
    for(int i=0;i<=sz-1;i++){
        int id=tmp[i]-'a'+1;
        if(!tree[root][id]){
            return false;
        }
        root=tree[root][id];
    }
    if(sum[root]){
        return true;
    } else {
        return false;
    }
}
void solve(){
    while(gets(str)){
        if(str[0]=='#'){
            break;
        }
       // getchar();
        //de(str);
        tot=0;
        string tmp;
        int len=strlen(str);

        //de(str);
        int ans=0;
        for(int i=0;i<len;i++){
            if(str[i]==' '){
                continue;
            }
            //if(i==0||str[i]==' ')
                int j=i;
                tmp="";
                while(j<len&&str[j]!=' '){
                    tmp+=str[j++];
                }
                i=j;
                //de(tmp);
                if(!check(tmp)){
                    ans++;
                    insert(tmp);
                }
            //}
        }
        printf("%d\n",ans);
        for(int i=0;i<=tot;i++){
            sum[i]=0;
            for(int j=1;j<=26;j++){
                tree[i][j]=0;
            }
        }
    }
}

getline写法

int tree[maxn][27];
int sum[maxn],tot;
void insert(string tmp){
    int sz=tmp.size();
    int root=0;
    for(int i=0;i<=sz-1;i++){
        int id=tmp[i]-'a'+1;
        if(!tree[root][id]){
            tree[root][id]=++tot;
        }
        root=tree[root][id];
        //sum[root]++;
    }
    sum[root]++;
}
bool check(string tmp){
    int sz=tmp.size();
    int root=0;
    for(int i=0;i<=sz-1;i++){
        int id=tmp[i]-'a'+1;
        if(!tree[root][id]){
            return false;
        }
        root=tree[root][id];
    }
    if(sum[root]){
        return true;
    } else {
        return false;
    }
}
void solve(){
    string pp;
    while(getline(cin,pp)&&pp!="#"){
        tot=0;
        int ans=0;
        ms(tree,0),ms(sum,0);
        stringstream str(pp);
        string tmp;
        while(str>>tmp){
            if(!check(tmp)){
                ans++;
                insert(tmp);
            }
        }
        cout<<ans<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/leoxe/article/details/105983336