hdu1251统计难题+字典树

来源:互联网 发布:手机门窗设计软件 编辑:程序博客网 时间:2024/05/17 02:01

Problem Description
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).

Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.

Output
对于每个提问,给出以该字符串为前缀的单词的数量.

Sample Input

banana
band
bee
absolute
acm

ba
b
band
abc

Sample Output

2
3
1
0

Author
Ignatius.L

给出一堆字符串1,再给一堆的字符串2。问字符串2在字符串1出现的前缀次数。。

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;#define LL long longconst int sigma_size=27;struct TireNode{    int pass;    //int last;    TireNode *son[sigma_size];    TireNode(){        pass=0;        //last=0;        for(int i=0;i<sigma_size;i++) son[i]=NULL;        //memset(son,NULL,sizeof(son));    };};TireNode *root=new TireNode();int getnum(char a){    return a-'a'+1;}void Tire_insert(char *s){    int len=strlen(s);    TireNode *in=root;    for(int i=0;i<len;i++){        int c=getnum(s[i]);        if(in->son[c]==NULL){            TireNode *newnode=new TireNode();            in->son[c]=newnode;        }        in=in->son[c];        in->pass++;    }    //in->last++;}int Tire_query(char *s){    int len=strlen(s);    TireNode *in=root;    for(int i=0;i<len;i++){        int c=getnum(s[i]);        if(in->son[c]==NULL) return 0;        in=in->son[c];    }    return in->pass;    //return in->last;}void Tire_remove(char *s){    int len=strlen(s);    TireNode *in=root;    for(int i=0;i<len;i++){        int c=getnum(s[i]);        if(in->son[c]!=NULL){            in->pass--;           // if(i==len-1) in->last--;            in=in->son[c];        }        else return;   //节点不存在,直接返回    }}int dealTrie(TireNode* T){  //释放一颗字典树    if(T==NULL) return 0;    for(int i=0;i<sigma_size;i++){        if(T->son[i]!=NULL) dealTrie(T->son[i]);    }    free(T);    return 0;}char a[11];int main(){    while(1){        gets(a);        if(strlen(a)==0) break;        Tire_insert(a);    }    while(scanf("%s",a)!=EOF){        printf("%d\n",Tire_query(a));    }    dealTrie(root);//豪爷说要有工程严谨性,释放内存    return 0;}
0 0
原创粉丝点击