Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 5829 | Accepted: 2403 |
Description
In the sample input below, "carbohydrate" can be abbreviated to "carboh", but it cannot be abbreviated to "carbo" (or anything shorter) because there are other words in the list that begin with "carbo".
An exact match will override a prefix match. For example, the prefix "car" matches the given word "car" exactly. Therefore, it is understood without ambiguity that "car" is an abbreviation for "car" , not for "carriage" or any of the other words in the list that begins with "car".
Input
Output
Sample Input
carbohydrate
cart
carburetor
caramel
caribou
carbonic
cartilage
carbon
carriage
carton
car
carbonate
Sample Output
carbohydrate carboh
cart cart
carburetor carbu
caramel cara
caribou cari
carbonic carboni
cartilage carti
carbon carbon
carriage carr
carton carto
car car
carbonate carbona
下面贴代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define max 26
typedef struct node //字典树节点信息
{
struct node * next[max];
int flag; //记录字母出现的次数
}node, * Node;
Node root; //根节点
char str[1000][25], sub[1000][25]; //str[][]记录输入的字符串,sub[][]记录前缀字符串
void insert(char * str) //建树
{
int i, len, index;
Node current, newnode;
len = strlen(str);
if(len == 0)
return ;
current = (Node) calloc (1, sizeof(node)); //分配空间
current = root;
for(i = 0; i < len; i ++)
{
index = str[i] - 'a'; //寻找该字符存放的位置
if(current->next[index] != NULL) //如果该字符已存在
{
current = current->next[index];
(current->flag) ++; //该字符出现的次数加1
}
else //如果该字符不存在,新增一个节点
{
newnode = (Node) calloc (1, sizeof(node)); //分配空间
current->next[index] = newnode; //指针移动
current = newnode;
current->flag = 1; //出现次数赋为1
}
}
}
void find(char * str, char * sub) //找前缀
{
int i, index, len;
Node current;
len = strlen(str);
current = (Node) calloc (1, sizeof(node)); //分配空间
current = root;
for(i = 0; i < len; i ++)
{
index = str[i] - 'a'; //寻找该字符所在的下标
current = current->next[index];
sub[i] = str[i]; //赋值
if(current->flag == 1) //判断是否已为该串所特有
{
i ++;
sub[i] = str[i];
sub[i ++] = '\0';
return ;
}
}
sub[i] = '\0';
}
int main()
{
int j, i = 0;
root = (Node) calloc (1, sizeof(node));
while(scanf("%s", str[i]) != EOF) //输入
{
insert(str[i]);
i ++;
}
for(j = 0; j < i; j ++) //查找
{
find(str[j], sub[j]);
}
for(j = 0; j < i; j ++) //输出
{
printf("%s %s\n", str[j], sub[j]);
}
return 0;
}