nkoj 1930 最短前缀
来源:互联网 发布:java int几字节 编辑:程序博客网 时间:2024/06/05 00:42
问题描述
有一字符串”carbon”,它的子串”c”, “ca”, “car”, “carb”, “carbo”, “carbon”称为它的前缀。也就是说一个字符串的前缀是指从该字符串最左边开始的子串。注意:空字符串不能被当作前缀,每个非空字符串本身也是它自己的前缀。
在我们日常的口语中,我们很多时候都只说单词的前缀,而不是把整个单词都说完。比如:单词“carbohydrate”常常在口语中被说成“carb”。
给你一些单词,你的任务是找出每个单词的最短前缀,要求不同的单词不能有相同的最短前缀。
还有就是如果一个单词的前缀恰好是它本身,比如前缀”car”完全和单词”car”本身相同了,那么我们认为前缀”car”只能作为单词”car”的前缀,不能作为其它以”car”开始的单词比如”carriage”的前缀
输入
输入数据包含若干行(不超过1000行)
每行是一个长度不超过20的单词。
输出
输出与输入有相同的行数
每行为空格间隔的两个单词,第一个为原单词,第二个为该单词的最短前缀
样例输入
carbohydrate
cart
carburetor
caramel
caribou
carbonic
cartilage
carbon
carriage
carton
car
carbonate
样例输出
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)解决,注意要区分不同的前缀,具体代码如下
#include<iostream>#include<string>using namespace std;const int maxn=1005;struct node{ int next[27]; int cnt;//节点重复出现的次数 }trie[maxn*100];string s[maxn];int tot=1,n=1;void insert(string c){ int len=c.length(); c=" "+c; int p=1,t; for(int i=1;i<=len;i++) { t=c[i]-'a'; trie[p].cnt++;//记录节点重复出现的次数 if(trie[p].next[t]==0) { tot++; trie[p].next[t]=tot; p=tot; } else p=trie[p].next[t]; } trie[p].cnt++;}void find(string c){ int len=c.length(); int p=1; c=" "+c; string t; bool flag=0; for(int i=1;i<=len;i++) { p=trie[p].next[c[i]-'a']; t+=c[i]; if(trie[p].cnt==1)//节点重复出现的次数 { cout<<t; break; } } int tem=0; for(int i=0;i<=25;i++) if(trie[p].next[i])tem++; if(tem&&trie[p].cnt>tem)cout<<t; //对于单词被包含的情况,记录多的种类的个数,存在当前节点重复的次数>种数; cout<<endl;}int main(){ string t; while(cin>>t!=NULL) { insert(t); s[n++]=t; } for(int i=1;i<n;i++) { cout<<s[i]<<" "; find(s[i]); } return 0;}
- nkoj 1930 最短前缀
- 最短前缀
- 06:最短前缀
- poj 2797 最短前缀
- 2797:最短前缀(题解)
- 排队的最短平均时间 nkoj 2183
- poj百练2797:最短前缀
- 百练 2797:最短前缀
- NOI题库1799 最短前缀
- 百炼 2797:最短前缀
- 最短前缀(字典树)
- 字典树 06:最短前缀
- 第4章练习题--7--最短前缀--2797
- 最短的名字+csuoj+前缀树(字典树)
- 求单词最短的确切前缀表示
- uvalive 3026 Period (前缀最短循环节)
- 2797:最短前缀(c++ 字典树)
- POJ Shortest Prefixes -- 最短前缀问题 -- 字典树
- 秒杀设计的小结
- Android Fragment的生命周期及使用
- 2.7-3 Android Studio 的Gradle一点理解, 查看gradle 版本和android 插件的版本
- GreenDao数据库
- CentOS6.x 和 CentOS6.x 设置防火墙
- nkoj 1930 最短前缀
- 九九乘法表
- 什么是异常处理?
- 写一个函数,判断素数
- Mysql 5.7.19压缩包版-从安装到卸载
- Okhttp网络请求
- js的element中,属性以scroll、client和offset为前缀的属性的区别
- 云计算基础架构(一)
- spring整合quartz并持久化