当前位置: 首页 > news >正文

OpenJudge | Shortest Prefixes

总时间限制: 1000ms 内存限制: 65536kB

描述

A 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”.

输入

The input contains at least two, but no more than 1000 lines. Each line contains one word consisting of 1 to 20 lower case letters.

输出

The 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.

样例输入

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

思路

  1. 先创建一个字典树,然后将所有的单词插入到字典树中。
  2. 对于每一个单词,从根节点开始,如果当前节点的子节点数为1,那么就继续往下走,直到找到一个子节点数为1或者到达单词的末尾。
  3. 输出这个单词和这个单词的前缀。

参考代码

#include <bits/stdc++.h>
using namespace std;struct node {unordered_map<char, node*> mp;int count, isEnd;
} root;vector<pair<string,string>> res;void abjust(string s) {node *p = &root;for(int i = 0; i < s.size(); ++i) {if(p->mp.find(s[i]) != p->mp.end()) {++(p->count);p = p->mp[s[i]];} else {p->mp[s[i]] = new node();++(p->count);p = p->mp[s[i]];}}p->isEnd = 1;p->count += 1;
}void findShortestPrefixes(string s) {node *p = &root;int count = 0;for(int i = 0; i < s.size(); ++i) {if(p->count == 1) {res.push_back(make_pair(s, s.substr(0, count)));return;}p = p->mp[s[i]];++count;}res.push_back(make_pair(s, s.substr(0, count)));
}int main() {string s;vector<string> v;while(cin >> s) {v.push_back(s);}for(auto i: v) {abjust(i);}for(auto i: v) {findShortestPrefixes(i);}for(auto i: res) {cout << i.first << " " << i.second << endl;}
}

一些想法

我当时犯了一个错误,就是想着一边创建字典树,一边查找最短前缀,这样是不行的,因为我们不知道所有的情况,会导致很多的错误。
应该考虑到先创建字典树,然后再查找最短前缀。这样就不会出现问题了。

http://www.lryc.cn/news/455294.html

相关文章:

  • 速盾:高防服务器是如何防御CC攻击的?
  • Android阶段学习思维导图
  • React生命周期案例详解
  • 【ubuntu】ubuntu20.04安装显卡驱动
  • Mongo Java Driver使用getCollection做分页查询遇到的一些坑
  • RK3568笔记六十四:SG90驱动测试
  • 31 基于51单片机的水位监测系统仿真
  • Docker 实践与应用举例
  • 公开数据集网站分享
  • 实验OSPF路由协议(课内实验)
  • GPU Puzzles讲解(一)
  • 滚雪球学Oracle[1.3讲]:内存与进程架构
  • Nginx的正向与反向代理
  • esp8266 at指令链接wifi时一直connect disconnest
  • 基于SpringBoot博物馆游客预约系统【附源码】
  • 【JVM】内存区域划分,类加载的过程,.class文件的格式
  • esp32-camera入门(基于ESP-IDF)
  • react中类式组件与函数式组件的区别
  • 【D3.js in Action 3 精译_030】3.5 给 D3 条形图加注图表标签(下):Krisztina Szűcs 人物专访 + 3.6 本章小结
  • 【重学 MySQL】五十六、位类型
  • Centos7 NTP客户端
  • 手机号归属地查询-手机号归属地-手机号归属地-运营商归属地查询-手机号码归属地查询手机号归属地-运营商归属地
  • CoppeliaSim和Matlab建立远程连接教程
  • 使用STS以及签名URL临时授权访问OSS资源
  • Next.js 14 使用 react-md-editor 编辑器 并更改背景颜色
  • 【Iceberg分析】Spark与Iceberg集成落地实践(一)
  • 【Verilog学习日常】—牛客网刷题—Verilog进阶挑战—VL45
  • 【强训笔记】day27
  • Nginx06-静态资源部署
  • MySQL数据库专栏(二)SQL语句基础操作