[openjudge] 2797最短前缀 Trie

描述

  一个字符串的前缀是从该字符串的第一个字符起始的一个子串。例如 "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

暴力的做法 :遍历每个单词可能的前缀 ,并在其他单词从搜索, 如果包含在其他某个单词的前面, 就不能作为前缀 ,搜寻下一个可能的前缀。
      如果所有可能的前缀都在其他某个含有就是其本身。
#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
using namespace std;char w[1010][45];
char pre[22];
int n;bool in(char *s, int index)
{for (int i = 0; i < n; i++) {if (strcmp(s, w[index]) == 0)return 0;if (i == index)continue;if (strstr(w[i], s)== &w[i][0])return 1;}return 0;
}int main()
{//freopen("1.txt", "r", stdin);n = 0;while (~scanf("%s", w[n++]));for (int i = 0; i < n; i++) {for (int j = 0; j < strlen(w[i]); j++) {memset(pre, 0, sizeof(pre));strncpy(pre, w[i], j+1);if (!in(pre, i)) {strcat(w[i], " ");strcat(w[i], pre);break;}}}for (int i = 0; i < n; i++)puts(w[i]);return 0;
}

也可利用Trie,字典树 

先建树,一直查找字符串的前缀,一直到某个字母,num为1,即以此为前缀的字符串为1,是唯一的

#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;struct Trie
{Trie *next[26];int num;Trie(){for (int i = 0; i < 26; i++)next[i] = NULL;num = 0;}
};Trie root;
void Insert(char *s)
{Trie *p = &root;for (int i = 0; s[i]; i++) {int t = s[i]-'a';if (p->next[t] == NULL)p->next[t] = new Trie;p = p->next[t];p->num++;}
}void Find(char *s)
{Trie *p = &root;for (int i = 0; s[i]; i++) {int t = s[i]-'a';if (p->next[t] == NULL)return;p = p->next[t];printf("%c", s[i]);if (p->num == 1)return;}
}int main()
{//freopen("1.txt", "r", stdin);int n = 0;char w[1010][21];while (~scanf("%s", w[n])) {Insert(w[n]);n++;}for (int i = 0; i < n; i++) {printf("%s ", w[i]);Find(w[i]);printf("\n");}return 0;
}

 

 

转载于:https://www.cnblogs.com/whileskies/p/7203527.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 移植ucos_基于STM32F767的UCOSIII移植学习

(一)移植前的准备1.HAL库基本工程模板新建一个工程模块&#xff0c;其中包含LED驱动和串口驱动程序即可&#xff0c;用于验证UCOS-III系统能够正常工作。2.UCOS-III源码准备去Micrium官网下载最新的UCOSIII源码&#xff0c;下载地址&#xff1a;Micrium官网下载地址&#xff0c…

美国5G到底怎么了?

来源&#xff1a;网优雇佣军美国司法部长威廉巴尔&#xff08;William Barr&#xff09;在2月6日应华盛顿智库“战略与国际研究中心”&#xff08;CSIS, Center for Strategic & International Studies&#xff09;邀请&#xff0c;参加了“中国倡议”会议&#xff08;Chin…

Mysql实现幂等_MQ如何方式消息重复消费--幂等性

一、何为幂等性&#xff1f;其任意多次执行所产生的影响均与一次执行的影响相同从对系统的影响结果来说&#xff1a;At least once 幂等消费 Exactly once。那么如何实现幂等操作呢&#xff1f;最好的方式就是&#xff0c;从业务逻辑设计上入手&#xff0c;将消费的业务逻辑设…

SQL实践篇(一):使用WebSQL在H5中存储一个本地数据库

文章目录 简介本地存储都有哪些&#xff1f;如何使用WebSQL打开数据库事务操作SQL执行 在浏览器端做一个英雄的查询页面如何删除本地存储参考文献 简介 WebSQL是一种操作本地数据库的网页API接口&#xff0c;通过它&#xff0c;我们可以操作客户端的本地存储。 WebSQL曾经是H…

JavaScript之正方教务系统自动化教评[插件-转载]

【声明】本插件系学院学长原创&#xff0c;非博主所创&#xff0c;发布此处&#xff0c;仅供学习和效仿。 /*** name:正方教务系统自动化教评-插件* * author:chenzhongshu* date:2017-07-04* notice:原生js;无需依赖项**/(function() {var courseCode;var timer;var autoFill …

预计2024年之前载人登月!NASA授予马斯克贝索斯公司大单

来源&#xff1a;小小据外媒报道&#xff0c;当地时间周四&#xff0c;美国宇航局(NASA)宣布选中埃隆马斯克(Elon Musk)旗下美国太空探索技术公司SpaceX、杰夫贝索斯(Jeff Bezos)的蓝色起源公司&#xff08;Blue Origin&#xff09;和Dynetics为其设计和建造月球着陆系统&#…

java 遗传算法_[原]遗传算法Java实现源代码

【Title】[原]遗传算法Java实现源代码【Date】2013-04-07【Abstract】以前学习遗传算法时&#xff0c;用Java实现的遗传算法程序&#xff0c;现整理分享出来。【Keywords】wintys、遗传、算法、algorithm、种群、基因、个体、进化、染色体、适应度、Rosenbrock【Environment】W…

防止表单按钮多次提交

1. <form namefm method"POST" action"/"><p>按钮变灰</p>name: <input type"text" name"name"/><input type"button" value"提交" οnclick"javascript:{this.disabledtrue;doc…

理解进化的五座“桥”

来源&#xff1a;原理古往今来&#xff0c;达尔文是不是最具革命性的科学家之一&#xff1f;如果革命指的是把一个已经公认的学说颠倒过来&#xff0c;那挑战者还有很多&#xff0c;至少包括牛顿、爱因斯坦和量子力学的奠基者。这些物理学家超群绝伦的智慧能量&#xff0c;可能…

ACM训练计划建议(转)

ACM训练计划建议 From&#xff1a;freecode# Date&#xff1a;2015/5/20 前言&#xff1a; 老师要我们整理一份训练计划给下一届的学弟学妹们&#xff0c;整理出来了&#xff0c;费了不少笔墨&#xff0c;就也将它放到博客园上供大家参考。 菜鸟之作&#xff0c;大牛勿喷&…

java下载文件夹_java如何通过共享目录下载文件夹(有子文件夹)到本地目录?...

有没有大神会操作的&#xff1f;下面的代码只能下载文件夹下只是文件的&#xff0c;不能下载文件夹下包含子文件夹的文件public static void getShareFile(){System.out.println("开始");NtlmPasswordAuthentication auth new NtlmPasswordAuthentication("192…

【AI】【机器人】AI与机器人的42个终极问题与解答

来源&#xff1a;产业智能官 未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城市&#xff09;云脑研究计划&#xff0c;构建互联网&#xff08;城市&#xff09;云脑技术和企业图…

With you With me

With you With me 回来了&#xff0c;一起从零开始... 据说每一个敢说从零开始的都特么是个大牛&#xff08;for example hiphop-Man欧阳靖&#xff09;... 这些年的时间多有自己问自己&#xff0c;你特么到底在迷茫什么&#xff0c;想不通就去撞墙啊&#xff01;&#xff01;…

java集合转字符串,Java集合将字符串转换为字符列表

I would like to convert the string containing abc to a list of characters and a hashset of characters. How can I do that in Java ?List charList new ArrayList("abc".toCharArray());解决方案You will have to either use a loop, or create a collectio…

Linux服务器iops性能测试-fio

FIO是测试IOPS的非常好的工具&#xff0c;用来对硬件进行压力测试和验证&#xff0c;支持13种不同的I/O引擎&#xff0c;包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet,guasi, solarisaio 等等。 fio 官网地址&#xff1a;http://freecode.com/proj…

志澄观察:卫星互联网——太空经济新动力

图1 卫星互联网的组成来源&#xff1a;远望智库 引 言2020年04月20日国家发改委首次明确&#xff0c;将卫星互联网列入我国新型基础设施的范围&#xff0c;这项重大的战略决策&#xff0c;大大鼓舞了我国商业航天行业的信心。另一方面&#xff0c;2020年3月27日,在发展低…

java中位数_java 计算中位数方法

最近工作需要 要求把python的代码写成java版本&#xff0c;python中有一个np.median()求中位数的方法&#xff0c;java决定手写一个先说说什么是中位数&#xff1a;中位数就是中间的那个数&#xff0c;如果一个集合是奇数个&#xff0c;那么中位数就是按大小排列后&#xff0c;…

Unity 找到隐藏的UGUI

问题描述&#xff1a;在项目中需要在一开始将一个UGUI隐藏&#xff0c;之后在特定的时候再显示。 本来想的办法是在需要显示的时候调用GameObject.Find()找到这个UI并设置active&#xff0c; 但发现找出来的为null&#xff0c;经查阅资料发现GameObject.Find()只能find没有被隐…

一文读懂电磁学发展史[图文版]

来源&#xff1a;电子万花筒电磁学或称电动力学或经典电动力学。之所以称为经典&#xff0c;是因为它不包括现代的量子电动力学的内容。电动力学这样一个术语使用并不是非常严格&#xff0c;有时它也用来指电磁学中去除了静电学、静磁学后剩下的部分&#xff0c;是指电磁学与力…

java判断优先级代码_java运算符的优先级

下图是每种运算符的优先级&#xff0c;按照运算先后顺序排序(优先级相同的情况下&#xff0c;按照从左到右的顺序依次运算)优先级描述运算符1括号()、[]2正负号、-3自增自减&#xff0c;非、--、!4乘除&#xff0c;取余*、/、%5加减、-6移位运算<>、>>>7大小关系…