hdu 1251 1671字典树

来源:互联网 发布:金蝶软件下载中心 编辑:程序博客网 时间:2024/05/29 11:50

发现没有字典树的模板,找了下HDU1251算最裸的题了

 

字典树真是个很厉害的东西。。。

 

MALLOC分配空间记得要FREE 像我1671就MLE了= =

 

HDU 1251

#include<stdio.h>#include<string.h>#include<stdlib.h>struct dictree{   struct dictree*child[26];   int n;};struct dictree *root;void insert(char *source){     int len,i,j;     struct dictree *cur,*newnode;     len=strlen(source);     if(len==0) return ;     cur=root;     for(i=0;i<len;i++)     {        if(cur->child[source[i]-'a']!=0)        {           cur=cur->child[source[i]-'a'];           cur->n=cur->n+1;        }        else        {            newnode=(struct dictree *)malloc(sizeof(struct dictree));            for(j=0;j<26;j++)            newnode->child[j]=0;            cur->child[source[i]-'a']=newnode;            cur=newnode;            cur->n=1;        }     }}int find(char *source){    int i,len;    struct dictree *cur;    len=strlen(source);    if(len==0) return 0;    cur=root;    for(i=0;i<len;i++)    {      if(cur->child[source[i]-'a']!=0)        cur=cur->child[source[i]-'a'];      else         return 0;    }    return cur->n;}int main(){    char tmp[11];    int i,j;    root=(struct dictree *)malloc(sizeof(struct dictree));    for(i=0;i<26;i++)      root->child[i]=0;    while(gets(tmp)&&strlen(tmp)!=0)        insert(tmp);    while(scanf("%s",tmp)!=EOF)    {        i=find(tmp);        printf("%d\n",i);    }    return 0;}

hdu 1671

#include<stdio.h>#include<string.h>#include<stdlib.h>struct dictree{   struct dictree*child[10];   int n;};struct dictree *root;void build(char *src){     int i,j;     int len=strlen(src);     struct dictree *cur,*newnode;     cur=root;     for(i=0;i<len;i++)     {       if(cur->child[src[i]-'0']!=0)       {         cur=cur->child[src[i]-'0'];         cur->n=cur->n+1;       }       else       {           newnode=(struct dictree *)malloc(sizeof(struct dictree));           for(j=0;j<10;j++)           newnode->child[j]=0;           cur->child[src[i]-'0']=newnode;           cur=newnode;           cur->n=1;       }     }}void freedom(struct dictree *p){    for(int i=0;i<10;i++)    {       if(p->child[i]!=0)       freedom(p->child[i]);    }    free(p);}int find(char *src){    int i,j,len;    len=strlen(src);    struct dictree *cur;    cur=root;    for(i=0;i<len;i++)    {       if(cur->child[src[i]-'0']!=0)       cur=cur->child[src[i]-'0'];       else       return 0;       if(cur->n>1&&i==(len-1))       return 1;     }     return 0;}int main(){    int T,t;    scanf("%d",&T);    while(T--)    {       scanf("%d",&t);       int i,j;       char s[10100][12];       root=(struct dictree *)malloc(sizeof(struct dictree));       for(i=0;i<10;i++)       root->child[i]=0;       for(i=0;i<t;i++)       {         scanf("%s",s[i]);         build(s[i]);       }       int flag=0;       for(i=0;i<t;i++)       {          if(find(s[i])==1)          {          flag=1;          break;          }       }       if(flag)       printf("NO\n");       else       printf("YES\n");       freedom(root);    }    return 0;}


hdu 1671