POJ 2001 Shortest Prefixes 【 trie树(别名字典树)】
| Time Limit: 1000MS | Memory Limit: 30000K | |
| Total Submissions: 15574 | Accepted: 6719 |
Description
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
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
看完题后,感慨:简直不能忍,这么裸的字典树。接下来就是无脑式敲 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树(别名字典树)】的更多相关文章
- POJ 2001 Shortest Prefixes (Trie)
题目链接:POJ 2001 Description A prefix of a string is a substring starting at the beginning of the given ...
- poj 2001 Shortest Prefixes trie入门
Shortest Prefixes 题意:输入不超过1000个字符串,每个字符串为小写字母,长度不超过20:之后输出每个字符串可以简写的最短前缀串: Sample Input carbohydrate ...
- poj 2001 Shortest Prefixes(字典树trie 动态分配内存)
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15610 Accepted: 673 ...
- poj 2001:Shortest Prefixes(字典树,经典题,求最短唯一前缀)
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 12731 Accepted: 544 ...
- POJ 2001 Shortest Prefixes(字典树)
题目地址:POJ 2001 考察的字典树,利用的是建树时将每个点仅仅要走过就累加.最后从根节点開始遍历,当遍历到仅仅有1次走过的时候,就说明这个地方是最短的独立前缀.然后记录下长度,输出就可以. 代码 ...
- POJ 2001 Shortest Prefixes(字典树活用)
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 21651 Accepted: 927 ...
- OpenJudge/Poj 2001 Shortest Prefixes
1.链接地址: http://bailian.openjudge.cn/practice/2001 http://poj.org/problem?id=2001 2.题目: Shortest Pref ...
- poj 2001 Shortest Prefixes
字典树的简单应用. #include<stdio.h> #include<string.h> ][]; struct node{ int cnt; node *next[]; ...
- poj 2001 Shortest Prefixes(字典树)
题目链接:http://poj.org/problem?id=2001 思路分析: 在Trie结点中添加数据域childNum,表示以该字符串为前缀的字符数目: 在创建结点时,路径上的所有除叶子节点以 ...
随机推荐
- 删除ARCSDE表空间和用户后,新建时出现error -1:O的解决办法
对于刚开始使用arcsde的用户,可能会出现各种问题,慢慢来就会找到解决办法 当我们删除用户和表空间时,在服务器本地还保留这sde.dbf文件(删除时选择了删除本地文件,不知道为什么), 我们可以换一 ...
- root Android 模拟器
参考文档:http://blog.csdn.net/xbalien29/article/details/22661479 本文以2.3.3版本系统为目标. 一 准备工作 首先我们需要准备3样工具:su ...
- python相关的编码,运算
一 字符串的格式化 python中使用占位符%来实现. name=input('name:') age=input('age:') hobby=input('hobby:') print('%s的年龄 ...
- 【02】webpack 之 入门
http://www.jianshu.com/p/42e11515c10f 写在前面的话 阅读本文之前,先看下面这个webpack的配置文件,如果每一项你都懂,那本文能带给你的收获也许就比较有限,你可 ...
- VMWare VMNet 8 的配置使用
网上有很多讲解VMWare网络原理的文章,我在这里就不在赘述,有兴趣的朋友可以自己搜 本章主要介绍下我们使用VM最常用的两种网络模式,VMNet 0 和 VMNet 8 本文均为原创,如需转载请标明, ...
- JS与验证控件结合验证
原文发布时间为:2010-05-14 -- 来源于本人的百度文章 [由搬家工具导入] 把BUTTOn中 的return CheckFive()去 掉 .. 放 到 <Form id=" ...
- 什麼是 usb upstream port
主機USB埠是定義為USB纜線的上行端(Upstream)或「A」接頭,即PC端.而裝置USB埠是定義為USB纜線的下行端(Downstream)或「B」接頭,即行動產品端. Reference ht ...
- FZU2187 回家种地(矩形面积并)
矩形面积并(只覆盖一次的面积)的裸题.好久没写代码debug了我太久,太辛酸了. #pragma warning(disable:4996) #include <iostream> #in ...
- webapi 初识 net
1.新建一个webapi 项目. 2.新建筛选器文件,用户在接口执行前后进行特性操作. public class MyActionWebApiAttribute : ActionFilterAttri ...
- Netty内存池
参考资料:http://blog.csdn.net/youaremoon/article/details/47910971 主要思想:buddy allocation,jemalloc