题目地址:POJ 2001

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

代码例如以下:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include<algorithm> using namespace std;
char s[1100][30];
struct node
{
int flag;
node *next[30];
};
node *newnode()
{
int i;
node *p;
p=new node;
for(i=0;i<26;i++)
{
p->next[i]=NULL;
}
p->flag=0;
return p;
}
void insert1(node *root, char *s)
{
int i, len=strlen(s), x;
node *p=root;
for(i=0;i<len;i++)
{
x=s[i]-'a';
if(p->next[x]==NULL)
p->next[x]=newnode();
p=p->next[x];
p->flag++;
}
}
int seach(node *root, char *s)
{
int i, len=strlen(s), x, pos=len;
node *p=root;
for(i=0;i<len-1;i++)
{
x=s[i]-'a';
p=p->next[x];
if(p->flag==1)
{
pos=i+1;
break;
}
}
return pos;
}
int main()
{
node *root;
root =newnode();
int cnt=0, i, j, k;
while(scanf("%s",s[cnt])!=EOF)
{
insert1(root,s[cnt]);
cnt++;
}
for(i=0;i<cnt;i++)
{
printf("%s ",s[i]);
k=seach(root,s[i]);
for(j=0;j<k;j++)
{
printf("%c",s[i][j]);
}
printf("\n");
}
return 0;
}

最新文章

  1. Apache 配置 Basic 认证
  2. C# 如何执行bat文件 传参数
  3. NFS,FTP
  4. 如何定义让两个div横向排列
  5. [基础] Python问题
  6. C#程序调用cmd执行命令(转)
  7. Android项目记录点滴
  8. 使用 Spring 2.5 TestContext 测试DAO层
  9. jpush 延迟推送的栗子
  10. python经常使用的十进制、16进制、字符串、字节串之间的转换(长期更新帖)
  11. Cocos Creator JS 获取当前日期与时间
  12. python中sort命令介绍以及list结构中统计各元素出现的个数的方法
  13. CSVN配置自动备份策略
  14. 【紫书】uva489 Hangman Judge 做了很久Orz
  15. Lecture2
  16. mysql性能优化2
  17. Linux删除Screen
  18. 了解ASP.NET Core框架的本质
  19. delphi XE3解析JSON数据
  20. 如何写出优雅的JavaScript代码 ? &amp;&amp; 注释

热门文章

  1. WMI概述
  2. c-指针的指针
  3. 使用top工具,找出消耗CPU 较多的进程
  4. 『重构--改善既有代码的设计』读书笔记----Introduce Explaning Variable
  5. bash shell学习-shell基础 (笔记)
  6. Debian ls 文件 文件夹颜色显示
  7. Jquery创建JSON对象
  8. php in_array比较原理和类型比较问题
  9. ajax切换明星头像!
  10. The first time