Shortest Prefixes(trie树唯一标识)
2015-10-25 20:04
309 查看
Shortest Prefixes
DescriptionA 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".InputThe
input contains at least two, but no more than 1000 lines. Each line
contains one word consisting of 1 to 20 lower case letters.
OutputThe
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
Sample Output
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 15948 | Accepted: 6887 |
"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".InputThe
input contains at least two, but no more than 1000 lines. Each line
contains one word consisting of 1 to 20 lower case letters.
OutputThe
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 题解:让找唯一能确定一个单词的前缀;我们想到当唯一确定的时候必定word[k]是1;那么很好解决了 代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<vector> #define mem(x,y) memset(x,y,sizeof(x)) using namespace std; typedef long long LL; const int MAXN=10100; char s[1010][30]; int ch[MAXN][30],word[MAXN]; int sz; void initial(){ sz=1; mem(word,0); } void insert(char *s){ int len=strlen(s); int j,k=0; for(int i=0;i<len;i++){ j=s[i]-'a'; if(!ch[k][j]){ mem(ch[sz],0); ch[k][j]=sz++; } k=ch[k][j]; word[k]++; } } void find(char *s){ int len=strlen(s); int j,k=0; for(int i=0;i<len;i++){ j=s[i]-'a'; k=ch[k][j]; printf("%c",s[i]); if(word[k]==1)return; } } int main(){ int x=0; initial(); while(~scanf("%s",s[x])){ insert(s[x]);x++; } for(int i=0;i<x;i++){ printf("%s ",s[i]); find(s[i]);puts(""); } return 0; }
相关文章推荐
- MySQL自带的性能压力测试工具mysqlslap详解
- 项目五——计数的模式匹配
- 软考--线性表操作
- MSSQLSERVER之发布-分发-订阅
- 字符串中字符调换
- [置顶] android webview 底层实现的逻辑
- 第六次作业 业务流程、知识管理、项目整体绩效评估
- android webview 底层实现的逻辑
- android webview 底层实现的逻辑
- android webview 底层实现的逻辑
- android webview 底层实现的逻辑
- android webview 底层实现的逻辑
- 对final数据类型的简单理解
- 浅谈--UITabelView
- cocos-js 跨域显示图片
- 【Cocos Shader】Shader Animation 跳动的心
- [转]JBOSS4.3关于java.lang.OutOfMemoryError: PermGen space解决方法
- HOWTO: Be more productive by Aaron Swartz
- hibernate的两种数据库连接池技术
- 调起qq临时通话