码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1247 Hat’s Words Trie树(+测试数据)

时间:2015-08-06 16:36:43      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:

  1. /*
  2. 这个题的题意:在一些字符串中,找到这样字符串:由两个其他的字符串构成(也可能是由同一个单词两次构成 )!
  3. */
  4. #include <iostream>
  5. #include <stdio.h>
  6. #include <algorithm>
  7. #include <math.h>
  8. #include <string.h>
  9. #define N 26
  10. #define PI acos(-1.0)
  11. using namespace std;
  12. typedef struct Trie
  13. {
  14.     int sum;
  15.     int flag;
  16.     struct Trie *next[N];
  17. };
  18. Trie *root=NULL;
  19. Trie *Newnode()/*初始化树*/
  20. {
  21.     Trie *p=(Trie *)malloc(sizeof(Trie));
  22.     p->sum=0;
  23.     p->flag=0;
  24.     for(int i=0;i<N;i++)
  25.         p->next[i]=NULL;
  26.     return p;
  27. }
  28. void creatTire(char *s)/*建树   这个可以作为模版*/
  29. {
  30.     int i,len=strlen(s);
  31.     Trie *p=root;
  32.     for(i=0;i<len;i++)
  33.     {
  34.         int k=s[i]-‘a‘;
  35.         if(p->next[k]==NULL)
  36.             p->next[k]=Newnode();
  37.         p=p->next[k];
  38.         p->sum++;
  39.     }
  40.     p->flag=1;/*标记一个字符串的最后一个单词*/
  41. }
  42. void del(Trie *p)/*清除树*/
    {
        int i;
        if(p==NULL)
            return ;
        for(i=0;i<N;i++)
            if(p->next[i]!=NULL)
                del(p->next[i]);
        free(p);
    }
  43. int findTire(char *s)
  44. {
  45.     Trie *p=root;
  46.     int n=strlen(s),i;
  47.     for(i=0;i<n;i++)
  48.     {
  49.         int j,k;
  50.         k=s[i]-‘a‘;
  51.         p=p->next[k];
  52.         if(p==NULL)
  53.             break;
  54.         if(p->flag==1&&i!=n-1)/*找到了匹配的前半部分*/
  55.         {
  56.             j=i+1;
  57.             Trie *q=root;
  58.             for(;j<n;j++)/*找后半部分*/
  59.             {
  60.                 k=s[j]-‘a‘;
  61.                 q=q->next[k];
  62.                 if(q==NULL)
  63.                     break;
  64.                          if(q->flag==1&&j==n-1)/*j==n-1表示完全匹配*/
  65.                     return 2;/*返回2说明找到符合题意的了*/
  66.             }
  67.                    //return 1;/*在这错了好久,要是找到了前半部分但是没找到匹配的后半部分应该把前半部分的下标向后移,继续判断!*/
  68.         }
  69.     }
  70.     return 0;
  71. }
  72. char s[51000][110];
  73. int main()
  74. {
  75.     int n,i=0,j;
  76.     root=Newnode();/*这儿要注意了  别忘了加上这一句*/
  77.     while(scanf("%s",s[i])!=EOF)/*有一些人说用ges错  就不太清楚了*/
  78.     {
  79.         creatTire(s[i]);
  80.         i++;
  81.     }
  82.     for(j=0;j<i;j++)
  83.     {
  84.         n=findTire(s[j]);
  85.         if(n==2)
  86.             printf("%s\n",s[j]);
  87.     }
  88.         //del(root);
  89.     return 0;
  90. }
  91. /*
  92. 自己写的几组测试数据:
  93. Input:
  94. a
  95. aa
  96. aaa
  97. Output:
  98. aa
  99. aaa
  100. Input:
  101. ab
  102. cd
  103. abcdef
  104. abcd
  105. Output:
  106. abcd
  107. */
  108. /*祝猿们AC愉快!第一次写博客....文笔不好。 只因这题虐我伤痕累累,(呜呜~>_<~+)好不容易写出来了,就总结了一下..这也预示着我的博客之旅的开启!√(─皿─)√*/

hdu 1247 Hat’s Words Trie树(+测试数据)

标签:

原文地址:http://www.cnblogs.com/yu0111/p/4708227.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!