HDU 1671 Phone List && POJ 3630 Phone List

举报
Linux猿 发表于 2021/08/05 00:04:30 2021/08/05
【摘要】 题目链接~~> 做题感悟: 简单的字典树题 解题思路:判断是否存在一个号码是另一个号码的前缀(这题号码不重复),但是POJ 上须静态字典树,就是先申请再将它们连接起来(思路一样),静态用时间很少。 代码(动态内存+释放): #include<stdio.h>#include<iostream>#include<map>#inc...

题目链接~~>

做题感悟: 简单的字典树题

解题思路:判断是否存在一个号码是另一个号码的前缀(这题号码不重复),但是POJ 上须静态字典树,就是先申请再将它们连接起来(思路一样),静态用时间很少。

代码(动态内存+释放):


  
  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<map>
  4. #include<string>
  5. #include<string.h>
  6. #include<stdlib.h>
  7. #include<queue>
  8. #include<algorithm>
  9. using namespace std ;
  10. #define LEN sizeof(struct node)
  11. int n ;
  12. bool flag ;
  13. struct node
  14. {
  15. bool count ;
  16. struct node *next[10] ;
  17. } ;
  18. struct node *root ; //根节点
  19. struct node *build() // 建立新节点
  20. {
  21. struct node *p ;
  22. p=(struct node*)malloc(LEN) ;
  23. for(int i=0 ;i<10 ;i++)
  24. {
  25. p->next[i]=NULL ;
  26. }
  27. p->count=false ;
  28. return p ;
  29. }
  30. void save(char *s) // 存单词同时判断
  31. {
  32. int len=strlen(s) ;
  33. if(!len) return ;
  34. struct node *p ;
  35. p=root ;
  36. for(int i=0 ;i<len ;i++)
  37. {
  38. int temp=s[i]-'0' ;
  39. if(p->next[temp]&&(p->next[temp]->count||len-1==i)) // 判断是否存在前缀
  40. {
  41. flag=true ;
  42. break ;
  43. }
  44. else if(p->next[temp]==NULL)
  45. p->next[temp]=build() ;
  46. p=p->next[temp] ;
  47. }
  48. p->count=true ;
  49. }
  50. void del(struct node *p)// 释放内存
  51. {
  52. for(int i=0 ;i<10 ;i++)
  53. if(p->next[i]!=NULL)
  54. del(p->next[i]) ;
  55. free(p) ;
  56. }
  57. int main()
  58. {
  59. int T ;
  60. char s[15] ;
  61. scanf("%d",&T) ;
  62. while(T--)
  63. {
  64. root=build() ;
  65. flag=false ;
  66. scanf("%d",&n) ;
  67. for(int i=0 ;i<n ;i++)
  68. {
  69. scanf("%s",s) ;
  70. if(!flag)
  71. save(s) ;
  72. }
  73. printf("%s\n",flag ? "NO" : "YES") ;
  74. del(root) ; // 释放内存
  75. }
  76. return 0 ;
  77. }

代码(静态字典树):


  
  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<map>
  4. #include<string>
  5. #include<string.h>
  6. #include<stdlib.h>
  7. #include<queue>
  8. #include<algorithm>
  9. using namespace std ;
  10. #define MX 1000000
  11. struct node
  12. {
  13. bool count ;
  14. struct node *next[10] ;
  15. }T[MX] ;
  16. struct node *root ;
  17. int top=0 ;
  18. bool flag ;
  19. struct node *build()
  20. {
  21. struct node *p ;
  22. p=&T[top++] ;
  23. for(int i=0 ;i<10 ;i++)
  24. {
  25. p->next[i]=NULL ;
  26. }
  27. p->count=false ;
  28. return p ;
  29. }
  30. void save(char *s)
  31. {
  32. int len=strlen(s) ;
  33. if(!len) return ;
  34. struct node *p ;
  35. p=root ;
  36. for(int i=0 ;i<len ;i++)
  37. {
  38. int temp=s[i]-'0' ;
  39. if(p->next[temp]&&(p->next[temp]->count||len-1==i))
  40. {
  41. flag=true ;
  42. return ;
  43. }
  44. if(p->next[temp]==NULL)
  45. p->next[temp]=build() ;
  46. p=p->next[temp] ;
  47. }
  48. p->count=true ;
  49. }
  50. int main()
  51. {
  52. int T,n ;
  53. char s[15] ;
  54. scanf("%d",&T) ;
  55. while(T--)
  56. {
  57. root=build() ;
  58. flag=false ;
  59. scanf("%d",&n) ;
  60. for(int i=0 ;i<n ;i++)
  61. {
  62. scanf("%s",s) ;
  63. if(!flag)
  64. save(s) ;
  65. }
  66. printf("%s\n",flag ? "NO" : "YES") ;
  67. top=0 ;
  68. }
  69. return 0 ;
  70. }


 

文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nyist_zxp/article/details/19121201

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。