Shortest Prefixes

题意:输入不超过1000个字符串,每个字符串为小写字母,长度不超过20;之后输出每个字符串可以简写的最短前缀串;

Sample Input

  1. carbohydrate
  2. cart
  3. carburetor
  4. caramel
  5. caribou
  6. carbonic
  7. cartilage
  8. carbon
  9. carriage
  10. carton
  11. car
  12. carbonate

Sample Output

  1. carbohydrate carboh (carbo不止一个字符串含有,所以不能作为简写符号)
  2. cart cart
  3. carburetor carbu
  4. caramel cara
  5. caribou cari
  6. carbonic carboni
  7. cartilage carti
  8. carbon carbon
  9. carriage carr
  10. carton carto
  11. car car
  12. carbonate carbona
  13.  
  14. 对于trie的理解主要是对空间复杂度的理解;这道题直接使用了26trie树,maxnode并不是字符串的个数,而是字符串个数乘以长度,每一个节点还含有26个子节点。其实存储的很稀疏;
    insert中,从根节点开始顺序查找是否有第i个字符的子节点,没有直接重新开一个行向量(++sz),这就导致了最坏的时间复杂度为maxn * maxl * 26;只是方便查找;查找时直接在线输出即可;
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<string.h>
  5. #include<algorithm>
  6. #include<vector>
  7. #include<cmath>
  8. #include<stdlib.h>
  9. #include<time.h>
  10. #include<stack>
  11. #include<set>
  12. #include<map>
  13. #include<queue>
  14. using namespace std;
  15. #define rep0(i,l,r) for(int i = (l);i < (r);i++)
  16. #define rep1(i,l,r) for(int i = (l);i <= (r);i++)
  17. #define rep_0(i,r,l) for(int i = (r);i > (l);i--)
  18. #define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
  19. #define MS0(a) memset(a,0,sizeof(a))
  20. #define MS1(a) memset(a,-1,sizeof(a))
  21. #define MSi(a) memset(a,0x3f,sizeof(a))
  22. #define inf 0x3f3f3f3f
  23. #define lson l, m, rt << 1
  24. #define rson m+1, r, rt << 1|1
  25. typedef pair<int,int> PII;
  26. #define A first
  27. #define B second
  28. #define MK make_pair
  29. typedef __int64 ll;
  30. template<typename T>
  31. void read1(T &m)
  32. {
  33. T x=,f=;char ch=getchar();
  34. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  35. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  36. m = x*f;
  37. }
  38. template<typename T>
  39. void read2(T &a,T &b){read1(a);read1(b);}
  40. template<typename T>
  41. void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
  42. template<typename T>
  43. void out(T a)
  44. {
  45. if(a>) out(a/);
  46. putchar(a%+'');
  47. }
  48. const int maxl = * + ;
  49. struct Trie{
  50. int ch[maxl][];
  51. int val[maxl];
  52. int sz;
  53. Trie(){sz = ;MS0(ch);MS0(val);}
  54. void Insert(char *s){
  55. int u = , n = strlen(s);
  56. for(int i = ;i < n;i++){
  57. int c = s[i] - 'a';
  58. if(!ch[u][c]){
  59. //MS0(ch[u]); //* 开始建trie时,初始化了,这里不能删除加入的信息
  60. ch[u][c] = sz++;
  61. }
  62. u = ch[u][c];
  63. val[u]++;
  64. }
  65. }
  66. int Find(char *s){
  67. int u = , n = strlen(s);
  68. for(int i = ;i < n;i++){
  69. int c = s[i] - 'a';
  70. putchar(s[i]);
  71. u = ch[u][c];
  72. if(val[u] == ) break;
  73. }
  74. }
  75. }trie;
  76. char s[][];
  77. int main()
  78. {
  79. int n = ;
  80. while(scanf("%s",s[n]) == ){
  81. trie.Insert(s[n++]);
  82. }
  83. rep0(i,,n){
  84. printf("%s ",s[i]);
  85. trie.Find(s[i]);
  86. puts("");
  87. }
  88. return ;
  89. }
  1.  

poj 2001 Shortest Prefixes trie入门的更多相关文章

  1. POJ 2001 Shortest Prefixes (Trie)

    题目链接:POJ 2001 Description A prefix of a string is a substring starting at the beginning of the given ...

  2. POJ 2001 Shortest Prefixes 【 trie树(别名字典树)】

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15574   Accepted: 671 ...

  3. poj 2001 Shortest Prefixes(字典树trie 动态分配内存)

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15610   Accepted: 673 ...

  4. OpenJudge/Poj 2001 Shortest Prefixes

    1.链接地址: http://bailian.openjudge.cn/practice/2001 http://poj.org/problem?id=2001 2.题目: Shortest Pref ...

  5. poj 2001:Shortest Prefixes(字典树,经典题,求最短唯一前缀)

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12731   Accepted: 544 ...

  6. POJ 2001 Shortest Prefixes(字典树)

    题目地址:POJ 2001 考察的字典树,利用的是建树时将每个点仅仅要走过就累加.最后从根节点開始遍历,当遍历到仅仅有1次走过的时候,就说明这个地方是最短的独立前缀.然后记录下长度,输出就可以. 代码 ...

  7. POJ 2001 Shortest Prefixes(字典树活用)

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 21651   Accepted: 927 ...

  8. POJ 2001 Shortest Prefixes 【Trie树】

    <题目链接> 题目大意: 找出能唯一标示一个字符串的最短前缀,如果找不出,就输出该字符串. 解题分析: Trie树的简单应用,对于每个单词的插入,都在相应字符对应的节点 num 值+1 , ...

  9. poj 2001 Shortest Prefixes(特里)

    主题链接:http://poj.org/problem?id=2001 Description A prefix of a string is a substring starting at the ...

随机推荐

  1. [006]为什么C++会被叫做是C++?

    先了解一下自增和自减的运算符: 自增(++)和自减(--)操作符为对象提供加1或减1操作: int i = 0, j; j = ++i; // j = 1, i = 1: prefix yields ...

  2. 进程环境之C程序的存储空间布局

    从历史上讲,C程序一直由下面几部分组成: 正文段.这是由CPU执行的机器指令部分.通常,正文段是可共享的,所以即使是频繁执行的程序(如文本编辑器.C编译器和shell等)在存储器中也只需有一个副本,另 ...

  3. 大设计时代:针对超大网页布局的一些思考和建议 [Aseoe]

    对于有些设计项目来说,老套的设计模式并不奏效,你需要设计的大点,要比以往设计的元素还要大,因此就非常适合采用超大网页布局.无论是采用大块大块的背景照片还是背景视频,超大网页布局的效果非常显著:极具视觉 ...

  4. ExtJs 继承 和 插件 示例

    Ext.ns('Ext.ux'); function btn(){ alert(this.id); }; var panel_plugs = {//定义插件 init : function(panel ...

  5. compile ffmpeg

    download SDL 1.2.xxx version source code. 1) configure 2) make & make instll download recent ffm ...

  6. Android 自学之基本界面组件(上)

    文本款(TextView)和编辑框(EditText)的功能和用法 TextView直接继承了View,他还是EditText.Button两个UI组件的父类,TextView的作用就是在界面上显示文 ...

  7. 关于gnome

    关于GNOME GNOME(发音为英语发音:/ɡəˈnoʊm/[4]),即GNU网络对象模型环境(英语:The GNU Network Object Model Environment),GNU计划的 ...

  8. Python(2.7.6) 特殊方法

    在 Python 中有种特殊方法,也称为魔法方法.特殊方法的方法名的前后各有两个下划线,如__init__,这种拼写表示名字有特殊的意义.如果类实现了这些方法中的某一个,那么这个方法会在特殊的情况下被 ...

  9. java多线程总结五:线程池的原理及实现

    1.线程池简介:     多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.        假设一个服务器完成一项任务所需时间为:T1 创 ...

  10. linux查看文件个数命令

    linux下查看当前目录下文件个数命令: 使用背景:有时想了解一个目录下具体有多少文件或者有多少文件夹. 1. 查看当前目录下文件个数 ls -l |grep "^-"|wc -l ...