单词的前缀 字典树
2012-08-05 10:54
274 查看
单词的前缀
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 167 Accepted Submission(s) : 46
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
ZZY 针对某个单词表给单词定义了特别的前缀,该前缀使得在该表中可以唯一标识某个单词,并且前缀的长度是最短。若有单词是另一个单词的前缀,那么该单词的前缀就是其本身。
Input
输入包含多组数据,对于每组数据,第一行是整数N(1~1000) ,表示单词表中单词的个数,接下来是N行,分别表示一个单词,每个单词长度不超过20 位,并且都是小写字母组成。
Output
对每组输入,输出2行,第一行输出“***Case 组号”,接下按之前的单词表顺序,输出N行,每行由单词表中的单词和前缀组成,中间用空格隔开.
Sample Input
1
a
10
lap
njzatz
jhjn
ousua
j
lhdahl
gtmz
xxisug
tv
aho
Sample Output
***Case 1
a a
***Case 2
lap la
njzatz n
jhjn jh
ousua o
j j
lhdahl lh
gtmz g
xxisug x
tv t
aho a
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int n;
char s[1005][25];
struct node
{
node *next[26];
int n;
};
node *root;
void insert(char *s)
{
node *p,*q;
int len;
len=strlen(s);
if(len==0)
return ;
p=root;
for(int i=0;i<len;i++)
{
if(p->next[s[i]-'a']==0)
{
q=(node *)malloc(sizeof(node));
for(int j=0;j<26;j++)
q->next[j]=0;
p->next[s[i]-'a']=q;
p=q;
p->n=1;
}
else
{
p=p->next[s[i]-'a'];
p->n=p->n+1;
}
}
}
void find(char *s)
{
int len;
node *p;
p=root;
len=strlen(s);
if(len==0)
return ;
printf("%s ",s);
for(int i=0;i<len;i++)
{
p=p->next[s[i]-'a'];
if(p->n==1)
{
printf("%c",s[i]);
return ;
}
else
printf("%c",s[i]);
}
}
int main()
{
int num=1;
int t;
while(scanf("%d",&n)!=EOF)
{
root=(node *)malloc(sizeof(node));
for(int i=0;i<26;i++)
root->next[i]=0;
root->n=0;
for(int i=0;i<n;i++)
{
scanf("%s",s[i]);
insert(s[i]);
}
printf("***Case %d\n",num++);
for(int i=0;i<n;i++)
{ find(s[i]);
printf("\n");
}
}
system("pause");
return 0;
}
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 167 Accepted Submission(s) : 46
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
ZZY 针对某个单词表给单词定义了特别的前缀,该前缀使得在该表中可以唯一标识某个单词,并且前缀的长度是最短。若有单词是另一个单词的前缀,那么该单词的前缀就是其本身。
Input
输入包含多组数据,对于每组数据,第一行是整数N(1~1000) ,表示单词表中单词的个数,接下来是N行,分别表示一个单词,每个单词长度不超过20 位,并且都是小写字母组成。
Output
对每组输入,输出2行,第一行输出“***Case 组号”,接下按之前的单词表顺序,输出N行,每行由单词表中的单词和前缀组成,中间用空格隔开.
Sample Input
1
a
10
lap
njzatz
jhjn
ousua
j
lhdahl
gtmz
xxisug
tv
aho
Sample Output
***Case 1
a a
***Case 2
lap la
njzatz n
jhjn jh
ousua o
j j
lhdahl lh
gtmz g
xxisug x
tv t
aho a
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int n;
char s[1005][25];
struct node
{
node *next[26];
int n;
};
node *root;
void insert(char *s)
{
node *p,*q;
int len;
len=strlen(s);
if(len==0)
return ;
p=root;
for(int i=0;i<len;i++)
{
if(p->next[s[i]-'a']==0)
{
q=(node *)malloc(sizeof(node));
for(int j=0;j<26;j++)
q->next[j]=0;
p->next[s[i]-'a']=q;
p=q;
p->n=1;
}
else
{
p=p->next[s[i]-'a'];
p->n=p->n+1;
}
}
}
void find(char *s)
{
int len;
node *p;
p=root;
len=strlen(s);
if(len==0)
return ;
printf("%s ",s);
for(int i=0;i<len;i++)
{
p=p->next[s[i]-'a'];
if(p->n==1)
{
printf("%c",s[i]);
return ;
}
else
printf("%c",s[i]);
}
}
int main()
{
int num=1;
int t;
while(scanf("%d",&n)!=EOF)
{
root=(node *)malloc(sizeof(node));
for(int i=0;i<26;i++)
root->next[i]=0;
root->n=0;
for(int i=0;i<n;i++)
{
scanf("%s",s[i]);
insert(s[i]);
}
printf("***Case %d\n",num++);
for(int i=0;i<n;i++)
{ find(s[i]);
printf("\n");
}
}
system("pause");
return 0;
}
相关文章推荐
- HDU-单词的前缀 字典树
- hdu1671Phone List(字典树---判断有无相同的前缀单词)
- 利用字典树查找唯一标记某单词的最小前缀
- poj 2001:Shortest Prefixes(字典树,经典题,求最短唯一前缀)
- hdu1247Hat’s Words (组合单词,字典树+DFS)
- HDU 1251 统计难题(字典树(统计前缀数量) || map运用)
- 储存每一个单词W以及W的所有前缀,特定方的方向执行一次扫描的时候,如果被查找的单词作为前缀不在散列表中,那么在这个方向上可以及早终止
- POJ 2418 Hardwood Species 经典字典树 统计单词出现次数
- HDOJ-1251 统计难题 字典树的应用-----统计一组字符串中某前缀出现次数(字典树第一类应用),
- 前缀 树 背单词(Remember the Word,LA 3942)
- HDU 1251 字典树 前缀计数
- hdu1247-字典树,单词拆分
- 字典树的应用 单词意义查找-C语言实现
- LeetCode14. Longest Common Prefix(字典树:最长公共前缀)
- 数据结构:Trie(单词查找树,字典树,前缀树)
- 字典树:求以某字符串开始的单词个数
- hdoj Immediate Decodability 1305 (字典树判断前缀)
- 求单词最短的确切前缀表示
- 英文单词构词之法 —— 前缀、后缀
- HDU 1671 字典树 查找前缀