1799:最短前缀

简介: 题目链接:http://noi.openjudge.cn/ch0406/1799/总时间限制:1000ms内存限制:65536kB描述一个字符串的前缀是从该字符串的第一个字符起始的一个子串。例如 "carbon"的字串是: "c", "ca", "car", "carb", "carbo", 和 "carbon"。

题目链接:http://noi.openjudge.cn/ch0406/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

【思路】

  暴力枚举:i枚举字符串,j枚举i串的前缀,k枚举所有字符串判断是否为前缀。时间复杂度O(m*n^2),其中n是字符串个数,m是字符串长度。

  假如测试数据真的达到极限:1000*1000*20,这个算法只能得部分测试点的分。

  代码如下:

 1 #include<stdio.h>
 2 #include<string.h>
 3 
 4 char str[1005][23];
 5 
 6 int main(int argc, char *argv[])
 7 {
 8     int n,i,j,k;
 9     char temp[30];
10     int f,len;
11     
12     i=0;    
13     while(scanf("%s",str[i])!=EOF) i++;
14     
15     n=i;
16     for(i=0;i<n;i++)
17     {
18         temp[0]='\0';
19         len=strlen(str[i]);
20         for(j=1;j<=len;j++)
21         {
22             //strncpy(temp,str[i],j);
23             temp[j-1]=str[i][j-1];
24             temp[j]='\0';
25             f=1;
26             for(k=0;k<n;k++)
27             {
28                 if(k!=i&&strncmp(temp,str[k],j)==0) { f=0; break; }
29             }
30             if(f==1) { printf("%s %s\n",str[i],temp); break; }
31         }
32         if(j>len) printf("%s %s\n",str[i],str[i]);
33     }
34     return 0;
35 }

网上资料:可以用字典树解决,这个留待以后研究吧。

 参考:http://blog.csdn.net/hahalidaxin/article/details/51017502

 

相关文章
|
存储 负载均衡 监控
数据同步时资源分配不均
数据同步时资源分配不均
256 6
|
算法框架/工具 图形学
Unity 四元数
Unity 四元数
362 0
|
前端开发
React中的页面跳转方式详解
React中的页面跳转方式详解
350 0
|
监控 安全 Linux
Linux C++ 环境下的FTP远程升级实现及异常处理策略
Linux C++ 环境下的FTP远程升级实现及异常处理策略
388 0
|
自然语言处理 Python
Python实现词频统计
Python实现词频统计
|
监控 算法 Java
进程调度的原理和算法探析
本文探讨了进程调度的原理和算法,并提供了全面的概述。进程调度是操作系统中的重要组成部分,用于决定进程的执行顺序和分配CPU时间。我们讨论了优先级调度和时间片轮转调度算法。优先级调度根据进程的优先级确定执行顺序,可以分为抢占式和非抢占式。时间片轮转调度将CPU时间划分为固定大小的时间片,每个进程在一个时间片内执行。合理设置时间片长度能够避免资源浪费和频繁的上下文切换。最短作业优先和最短剩余时间优先是常见的调度算法,通过预估和动态计算进程的执行时间提高系统效率和响应速度。多级反馈队列调度综合了优先级调度和时间片轮转调度的优点,适应不同类型的进程和任务。通过本文的阐述,读者将对进程调度的原理和算法有
639 0
进程调度的原理和算法探析
|
XML API Apache
ExcelKit
简单、好用且轻量级的海量Excel文件导入导出解决方案。
484 1
|
canal 消息中间件 SQL
Canal源码分析之启动时处理逻辑和主备切换机制
Canal源码分析之启动时处理逻辑和主备切换机制
467 0
|
canal 消息中间件 关系型数据库
使用阿里的增量日志解析工具canal
canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。
572 0
使用阿里的增量日志解析工具canal
|
Web App开发 编解码 前端开发
Unity Render Streaming 云渲染解决方案
Unity Render Streaming 云渲染解决方案
1427 1
Unity Render Streaming 云渲染解决方案