hdu 1251 统计难题(字典树)

字典树

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//构造字典树,26叉树,根结点为空 
 typedef struct node{
    node *child[26];//字符集大小 
    int n;//记录该字符出现次数 
};
node *root;//树是通过指针形式来表达的 

void insert(char *s){//创建字典树 
    node *p=root,*t;
    int i,len,j;
    len=strlen(s);
    for(i=0;i<len;i++){
        int id=s[i]-'a';
        if(p->child[id]!=0){
            p=p->child[id];
            p->n++;
        }else{//如果该字节点的字节点为空则要创建中间节点
            t=(node *)malloc(sizeof(node));
            for(j=0;j<26;j++)
               t->child[j]=0;
            p->child[id]=t;
            p=t;
            p->n=1;
        }
    }
}
//查找字典树 
int find(char *s){
     node *p=root;
     int i,j,len;
     len=strlen(s);
     for(i=0;i<len;i++){
        int id=s[i]-'a';
        if(p->child[id]!=0){
            p=p->child[id];
        }else{//如果当前指针p的对应于当前字符s[i]在字母表的位置的子节点为空
            return 0;//直接返回0 
        }
    }
    return p->n;
}            
int main(){
    int i,j;
    char s[15];
    root=(node *)malloc(sizeof(node));
    for(i=0;i<26;i++){
        root->child[i]=0;
        root->n=0;
    }//初始化字典树 
    while(gets(s),strcmp(s,"\0")){
        insert(s);
    }
    while(~scanf("%s",s)){
        i=find(s);
        printf("%d\n",i);
    }
    return 0;
}


 

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