1799:最短前缀

总时间限制:

1000ms

内存限制:

65536kB

描述

一个字符串的前缀是从该字符串的第一个字符起始的一个子串。例如 "carbon"的字串是: "c", "ca", "car", "carb", "carbo", 和 "carbon"。注意到这里我们不认为空串是字串, 但是每个非空串是它自身的字串. 我们现在希望能用前缀来缩略的表示单词。例如, "carbohydrate" 通常用"carb"来缩略表示. 现在给你一组单词, 要求你找到唯一标识每个单词的最短前缀
在下面的例子中,"carbohydrate" 能被缩略成"carboh", 但是不能被缩略成"carbo"
(或其余更短的前缀) 因为已经有一个单词用"carbo"开始
一个精确匹配会覆盖一个前缀匹配,例如,前缀"car"精确匹配单词"car". 因此 "car" 是 "car"的缩略语是没有二义性的 , “car”不会被当成"carriage"或者任何在列表中以"car"开始的单词.

输入

输入包括至少2行,至多1000行. 每行包括一个以小写字母组成的单词,单词长度至少是1,至多是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

来源

翻译自Rocky
Mountain 2004

【思路】

暴力枚举/ Trie

暴力枚举。I枚举字符串j枚举i串的前缀k枚举另一个字符串判断是否为前缀。理论时间为O(n^2m),时间为780ms。

Trie。用val表示是否为单词节点cnt表示节点出现的次数。当val>0或cnt==1时当前串即为最短前缀。理论时间为O(nm),时间为0ms。

【代码1】

 #include<iostream>
#include<cstdio>
using namespace std; const int maxn = +; string s[maxn];
int n; int main() {
while(cin>>s[n]) n++;
for(int i=;i<n;i++)
for(int j=;j<=s[i].size();j++) {
string tmp=s[i].substr(,j);
bool f=false;
for(int k=;k<n;k++) if(i!=k) {
if(s[k].substr(,j)==tmp) {
f=true;
break;
}
}
if(!f) {
cout<<s[i]<<" "<<tmp<<"\n";
break;
}
if(j==s[i].size()) cout<<s[i]<<" "<<s[i]<<"\n";
}
return ;
}

【代码2】

 #include<iostream>
#include<cstring>
#include<cstdio>
using namespace std; const int maxn = +;
const int maxnode = ;
const int sigma=;
struct Trie{
int sz,ch[maxnode][sigma];
int val[maxnode],cnt[maxnode];
void init() {
sz=;
memset(ch[],,sizeof(ch[]));
memset(cnt,,sizeof(cnt));
}
int id(char c) { return c-'a'; } void insert(string s,int v) {
int u=,n=s.size();
for(int i=;i<n;i++) {
int c=id(s[i]);
if(!ch[u][c]) {
sz++;
memset(ch[sz],,sizeof(ch[sz]));
val[sz]=;
ch[u][c]=sz;
}
u=ch[u][c];
cnt[u]++;
}
val[u]=v;
}
string find(string s) {
int u=,n=s.size();
for(int i=;i<n;i++) {
int c=id(s[i]);
u=ch[u][c];
if(cnt[u]== || (i==n-))
return s.substr(,i+);
}
}
}trie;
string s[maxn];
int n; int main() { trie.init();
while(cin>>s[n]){
trie.insert(s[n],n);
n++;
}
for(int i=;i<n;i++) {
cout<<s[i]<<" ";
cout<<trie.find(s[i])<<"\n";
}
return ;
}

NOI题库1799 最短前缀的更多相关文章

  1. NOI题库 1768最大子矩阵 题解

    NOI题库 1768最大子矩阵  题解     总时间限制: 1000ms 内存限制: 65536kB   描述   已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大 ...

  2. NOI题库刷题日志 (贪心篇题解)

    这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制:  1000ms  内存限制:  65536kB 描述 在一个平面上,如果有两个点( ...

  3. NOI题库 09:图像旋转翻转变换

    NOI题库开始的题,也是略水,当然也是大水,所以彼此彼此 09:图像旋转翻转变换 总时间限制: 1000ms 内存限制: 65536kB 描述 给定m行n列的图像各像素点灰度值,对其依次进行一系列操作 ...

  4. NOI题库-小学奥赛QwQ

    今天Loli教育我们让我们来看看NOI题库的奥赛部分,不过,为何是小学的( ⊙ o ⊙ )啊!感觉智商被各种侮辱. 余数相同问题: 描述 已知三个正整数 a,b,c. 现有一个大于1的整数x,将其作为 ...

  5. noi题库(noi.openjudge.cn) 1.7编程基础之字符串T31——T35

    T31 字符串P型编码 描述 给定一个完全由数字字符('0','1','2',-,'9')构成的字符串str,请写出str的p型编码串.例如:字符串122344111可被描述为"1个1.2个 ...

  6. noi题库(noi.openjudge.cn) 1.7编程基础之字符串T21——T30

    T21:单词替换 描述 输入一个字符串,以回车结束(字符串长度<=100).该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写.现需要将其中的某个单词替换成另一个单词,并输出替 ...

  7. NOI题库192 生日蛋糕

    192:生日蛋糕 总时间限制: 5000ms 内存限制: 65536kB 描述 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i ...

  8. NOI题库--盒子和小球系列 By cellur925

    题目传送门 盒子和小球之二:N个有差别的盒子(1<=N<=20).你有A个红球和B个蓝球.0 <= A <= 15, 0 <= B <= 15.球除了颜色没有任何区 ...

  9. NOI 题库 9272 题解

    9272   偶数个数字3 描述 在所有的N位数中,有多少个数中有偶数个数字3? 输入 一行给出数字N,N<=1000 输出 如题 样例输入 2 样例输出 73 Solution : 令f ( ...

随机推荐

  1. 记一次网站服务器迁移(my)

    遇到的难题: 基本没有遇到太大的问题,因为服务器环境是配好的阿里云环境,最后再nginx的rewrite配置遇到了一点问题,最后也算解决. 收获小点: 1) vim替换命令: 利用 :s 命令可以实现 ...

  2. delegate-使用笔记

    public class testclass { public class ProductImages : Page { protected Repeater rptSmallUrls; protec ...

  3. ueditor爬坑

    在使用UeEditor中遇到几个个坑 1.添加的html代码中使用的样式class被guolv掉 解决方案:在ueditor.config.js中,xss过滤白名单中,每个元素添加class,如下图 ...

  4. hdu2962 Trucking (最短路+二分查找)

    Problem Description A certain local trucking company would like to transport some goods on a cargo t ...

  5. 【POJ3580】【splay版】SuperMemo

    Description Your friend, Jackson is invited to a TV show called SuperMemo in which the participant i ...

  6. 『重构--改善既有代码的设计』读书笔记----Introduce Local Extension

    同Introduce Foreign Method一样,很多时候你不能修改编辑原始类,你需要为这些服务类增加一些额外的函数,但你没有这个权限或者入口.如果你只需要一个或者两个外加函数那么你可以放心的使 ...

  7. java 下载文件 内容为空。

    检查下是不是io流没有关闭,记得关闭所有流.

  8. DOM对象控制HTML无素——详解1

    getElementsByName()方法 返回带有指定名称的节点对象的集合. 语法: document.getElementsByName(name) 与getElementById() 方法不同的 ...

  9. 通过命令修改wampserver的mysql密码

    WAMP安装好后,mysql教程密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作. 首先,通过WAMP打开mysql控制台. 提示输入密码,因为现在是空,所以直接按 ...

  10. IOS 命令行安装备忘

    1. 首先要越狱 2. 新增BIGBOSS或者苹果核的源 3. 安装MobileTerminal和MobileTerm Backgrounder (用于后台运行命令),最好r520以上版本,R530还 ...