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

Description

A prefix of a string is a substring starting at the beginning of the given string. The prefixes of "carbon" are: "c", "ca", "car", "carb", "carbo", and "carbon". Note that the empty string is not considered a prefix in this problem, but every non-empty string
is considered to be a prefix of itself. In everyday language, we tend to abbreviate words by prefixes. For example, "carbohydrate" is commonly abbreviated by "carb". In this problem, given a set of words, you will find for each word the shortest prefix that
uniquely identifies the word it represents. 



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

The input contains at least two, but no more than 1000 lines. Each line contains one word consisting of 1 to 20 lower case letters.

Output

The output contains the same number of lines as the input. Each line of the output contains the word from the corresponding line of the input, followed by one blank space, and the shortest prefix that uniquely (without ambiguity) identifies this word.

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

看完题后,感慨:简直不能忍,这么裸的字典树。接下来就是无脑式敲 Trie 树了。这个题目能够拿来练练手速~。另外。一时没到比較合适的函数名,望 勿喷

题解就略了,容我贴下代码~

/****************************>>>>HEADFILES<<<<****************************/
#include <cmath>
#include <queue>
#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <algorithm>
using namespace std;
/****************************>>>>>DEFINE<<<<<*****************************/
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w",stdout)
#define rep(i,a,b) for(int i = a;i <= b;i++)
#define rep1(i,a) for(int i = 1;i <= a;i++)
#define rep0(i,a) for(int i = 0;i < a;i++)
#define MP(a,b) make_pair(a,b)
#define PB(a) push_back(a)
#define fst first
#define snd second
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
/****************************>>>>>>DEBUG<<<<<<****************************/
#define out(x) cout<<x<<""
/****************************>>>>SEPARATOR<<<<****************************/
const int maxk = 26;
const int maxl = 20+5;
int N,M;
struct Node
{
int cnt;
Node* pNext[maxk];
Node() : cnt(0)
{
rep0(i,maxk) pNext[i] = NULL;
}
};
struct Trie
{
Node* const pRoot;
Trie() : pRoot(new Node()) {}
void AddWord(const char str[],int len);
// int FindPredix(const char str[],int len);
void Query(const char str[],int len);
void Release(const Node *p);
}dic;
void Trie::AddWord(const char str[],int len)
{
Node* ptr = pRoot;
for(int i = 0;i < len;i++)
{
int nPos = str[i] - 'a';
if(ptr->pNext[nPos] == NULL) ptr->pNext[nPos] = new Node();
ptr->cnt++;
ptr = ptr->pNext[nPos];
}
ptr->cnt++;
}
void Trie::Release(const Node* p)
{
for(int i = 0;i < maxk;i++) if(p->pNext[i] != NULL) Release(p->pNext[i]);
delete p;
}
void Trie::Query(const char str[],int len)
{
Node* ptr = pRoot;
for(int i = 0;i < len;i++)
{
int nPos = str[i] - 'a';
if(ptr->pNext[nPos] == NULL) return;
if(ptr->cnt == 1) return;
putchar(str[i]);
ptr = ptr->pNext[nPos];
}
}
char buf[1005][maxl];
int main()
{
//FIN;
int cnt = 0;
while(~scanf("%s",buf[cnt]))
dic.AddWord(buf[cnt],strlen(buf[cnt])),cnt++;
for(int i = 0;i < cnt;i++)
{
printf("%s ",buf[i]);
dic.Query(buf[i],strlen(buf[i]));
puts("");
}
dic.Release(dic.pRoot);
return 0;
}

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 题意:输入不超过1000个字符串,每个字符串为小写字母,长度不超过20:之后输出每个字符串可以简写的最短前缀串: Sample Input carbohydrate ...

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

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

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

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

  5. POJ 2001 Shortest Prefixes(字典树)

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

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

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

  7. OpenJudge/Poj 2001 Shortest Prefixes

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

  8. poj 2001 Shortest Prefixes

    字典树的简单应用. #include<stdio.h> #include<string.h> ][]; struct node{ int cnt; node *next[]; ...

  9. poj 2001 Shortest Prefixes(字典树)

    题目链接:http://poj.org/problem?id=2001 思路分析: 在Trie结点中添加数据域childNum,表示以该字符串为前缀的字符数目: 在创建结点时,路径上的所有除叶子节点以 ...

随机推荐

  1. 【Luogu】P2488工作安排(费用流)

    题目链接 这题……费用流即可……(哇啊要被打死辣) 然而我printf("%d")爆零四次 好的心如死灰 #include<cstdio> #include<cs ...

  2. 用canvas绘制android机器人

    直接上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  3. [luoguP2224] [HNOI2001]产品加工(背包DP)

    传送门 f[i][j]表示第一个机器耗时j,第二个机器耗时f[i][j] 第一维可以滚掉 #include <cstdio> #include <cstring> #inclu ...

  4. easyUI 接收Spring Mvc中@ResponseBody中文乱码解决

    接触springMVC不够深入,乱码困扰我到深夜,特此留下记忆: @responsebody默认滴是ISO-8859-1 Controller注解参数 @ResponseBody 标注后返回Strin ...

  5. 【10】【转】node 之 pipe机制----未理解

    转载地址:http://blog.csdn.net/vieri_32/article/details/48376547 前言 前几天别人请教我关于pipe的问题,我发现我虽然用了nodejs很久,但是 ...

  6. 能量采集(bzoj 2005)

    Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后, 栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种 ...

  7. BZOJ【1609】 麻烦的聚餐

    609: [Usaco2008 Feb]Eating Together麻烦的聚餐 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1198  Solved ...

  8. Javascript&Html-延迟调用和间歇调用

    Javascript&Html-延迟调用和间歇调用 Javascript 是一种单线程语言,所有的javascript任务都会放到一个任务列表中,这些javascript任务会按照插入到列表中 ...

  9. MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类) Ver 1.65

    原文发布时间为:2010-02-07 -- 来源于本人的百度文章 [由搬家工具导入] http://www.popub.net/script/MSClass.html/*MSClass (Class ...

  10. boost::thread编程-线程中断(转)

    原文转自 http://blog.csdn.net/anda0109/article/details/41943691 thread的成员函数interrupt()允许正在执行的线程被中断,被中断的线 ...