hdu 1247 Hat’s Words (字典树模版)

来源:互联网 发布:java监控系统日志抓取 编辑:程序博客网 时间:2024/06/04 19:15
//那个单词是有出现的两个单词构成的# include <cstdio># include <cstring># include <algorithm># include <iostream># define MAX 26using namespace std;typedef struct Trie_Node{    bool isWord;    struct Trie_Node *next[MAX];// next是表示每层有多少种类的数} Trie;char s[50000][50];void insert(Trie *root,char *word)//生成字典树{    Trie *p=root;    while(*word!='\0')    {        if(p->next[*word-'a']==NULL)        {            Trie *temp=(Trie*)malloc(sizeof(Trie));            for(int i=0; i<MAX; i++)            {                temp->next[i]=NULL;            }            temp->isWord=false;            p->next[*word-'a']=temp;        }        p=p->next[*word-'a'];        word++;    }    p->isWord=true;}bool search(Trie *root,char *word)//查找单词是否存在{    Trie *p=root;    for(int i=0; word[i]!='\0'; i++)    {        if(p==NULL||p->next[word[i]-'a']==NULL)//若为空集,表示不存以此为前缀的串            return false;        p=p->next[word[i]-'a'];    }    return p->isWord;}void del(Trie *root)//释放空间{    for(int i=0; i<MAX; i++)    {        if(root->next[i]!=NULL)        {            del(root->next[i]);        }    }    free(root);//释放malloc申请的空间}int main(){    int i,j;    int count=0;    char str[50];    Trie *root=(Trie*)malloc(sizeof(Trie));    for(i=0; i<MAX; i++)    {        root->next[i]=NULL;    }    root->isWord=false;    while(~scanf("%s",str))    {        strcpy(s[count++],str);        insert(root,str);    }    for(i=0; i<count; i++)    {        for(j=1; j<=strlen(s[i])-1; j++)        {            char temp1[50]= {'\0'};            char temp2[50]= {'\0'};            strncpy(temp1,s[i],j);//枚举两部分            strncpy(temp2,s[i]+j,strlen(s[i])-j);            if(search(root,temp1)&&search(root,temp2))            {                printf("%s\n",s[i]);                break;            }        }    }    del(root);    return 0;}

0 0
原创粉丝点击