题目描述

有一天,小y突然发现自己的计算机感染了一种病毒!还好,小y发现这种病毒很弱,只是会把文档中的所有字母替换成其它字母,但并不改变顺序,也不会增加和删除字母。

现在怎么恢复原来的文档呢!小y很聪明,他在其他没有感染病毒的机器上,生成了一个由若干单词构成的字典,字典中的单词是按照字母顺序排列的,他把这个文件拷贝到自己的机器里,故意让它感染上病毒,他想利用这个字典文件原来的有序性,找到病毒替换字母的规律,再用来恢复其它文档。

现在你的任务是:告诉你被病毒感染了的字典,要你恢复一个字母串。

输入格式

第一行为整数K(≤50000),表示字典中的单词个数。

以下K行,是被病毒感染了的字典,每行一个单词。

最后一行是需要你恢复的一串字母。

所有字母均为小写。

输出格式

输出仅一行,为恢复后的一串字母。当然也有可能出现字典不完整、甚至字典是错的情况,这时请输出一个0。

样例

样例输入

6
cebdbac
cac
ecd
dca
aba
bac
cedab

样例输出

abcde

思路详解

这道题的难点就是建图(用过字典的就知道),把单词字母一一比较,发现不同的字母就按照字符串的先后顺序,就可得到感染病毒的字的顺序,然后就给这两个字母连边

如 cebdbac 与 cac 比较,第二个字母不同,得出原字母序 e < a

e 与 a 连一条有向边 e -> a

用 map 存每个字母代表的数

//map <char , int > T ;if( !T[s[i][j]] ) {cnt ++ ;T[s[i][j]] = cnt ;have[cnt] = s[i][j] ;
}
if( !T[s[i-1][j]] ) {cnt ++ ;T[s[i-1][j]] = cnt ;have[cnt] = s[i-1][j] ;
}

连边就用map里的值即可

if( s[i-1][j] != s[i][j] ) {int a = T[s[i-1][j]] ;int b = T[s[i][j]] ;G[a].push_back(b) ;in[b] ++ ; break ;
}

其次存一下出现了的字母,然后排序,再将字母求出拓扑序,按照拓扑序在排好的字母里一一对应

for( int i = 0 ; i < g.length() ; ++ i ) {int now = T[g[i]];int rig = ans[now] ;printf("%c", have[rig] );}//g为要求解的字符串

代码

理解消化,,

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
#define MAXN 50005
using namespace std;int n , cnt ;
int in[MAXN] , ans[MAXN] ;
bool flag ;
char have[MAXN] ;
string s[MAXN] , g ;
vector <int> G[MAXN] ;
map <char , int > T ;void Topol() {int count = 0 ;int k = 0 ;queue <int> q ;for( int i = 1 ; i <= cnt ; ++ i )if( !in[i] ) {k ++ ;q.push(i) ;}if( k != 1 ) {//拓扑序唯一flag = 1 ;return ;}while( !q.empty() ) {int sum = 0 ;int x = q.front() ;q.pop() ;count ++ ;ans[x] = count ;for( int i = 0 ; i < G[x].size() ; ++ i ) {int s = G[x][i] ;in[s] -- ;if( !in[s] ) {q.push(s); sum ++ ;}}if( sum > 1  ) {//保证拓扑序唯一flag = 1 ;return ;}}if( count != cnt )//拓扑跑完了的flag = 1 ;return ;
}int main() {scanf("%d", &n );for( int i = 1 ; i <= n ; ++i )cin >> s[i] ;cin >> g ;for( int i = 2 ; i <= n ; ++ i ) {for( int j = 0 ; j < min( s[i].length() , s[i-1].length() ) ; ++j ) {if( !T[s[i][j]] ) {//map存储cnt ++ ;T[s[i][j]] = cnt ;have[cnt] = s[i][j] ;//记录出现了的字母}if( !T[s[i-1][j]] ) {cnt ++ ;T[s[i-1][j]] = cnt ;have[cnt] = s[i-1][j] ;}if( s[i-1][j] != s[i][j] ) {//连边int a = T[s[i-1][j]] ;int b = T[s[i][j]] ;G[a].push_back(b) ;in[b] ++ ; break ;}}}Topol();if( flag ) {printf("0");return 0;}sort( have+1 , have+cnt+1 );//排序for( int i = 0 ; i < g.length() ; ++ i ) {//是否有没出现的字母int now = T[g[i]];if( now == 0 ) {printf("0");return 0;}}for( int i = 0 ; i < g.length() ; ++ i ) {//找正确的字母int now = T[g[i]];int rig = ans[now] ;printf("%c", have[rig] );}
}

C++解题报告:病毒(virus)——拓扑排序相关推荐

  1. 病毒virus - 拓扑排序

    题目描述 有一天,小y突然发现自己的计算机感染了一种病毒!还好,小y发现这种病毒很弱,只是会把文档中的所有字母替换成其它字母,但并不改变顺序,也不会增加和删除字母. 现在怎么恢复原来的文档呢!小y很聪 ...

  2. 2021字节跳动校招秋招算法面试真题解题报告--leetcode148 排序链表,内含7种语言答案

    148.排序链表 1.题目描述 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序 2.解题报告 针对nlogn的排序算法,主要有快速排序,归并排序和堆排序.其中,堆排序利用了数 ...

  3. UVALive 6467 Strahler Order 拓扑排序

    这题是今天下午BNU SUMMER TRAINING的C题 是队友给的解题思路,用拓扑排序然后就可以了 最后是3A 其中两次RE竟然是因为: scanf("%d",mm); ORZ ...

  4. 【拓扑排序】【DP】奖金(ssl 1325)

    奖金 ssl 1325 题目大意: 有n个人,某个人要比另外一个人的工资高(工资最低为100,最少多1元),问最少发多少工资 原题: 题目描述 由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,Y ...

  5. 【拓扑排序】【DP】旅行计划(luogu 1137)

    旅行计划 luogu 1137 题目大意: 有一堆点,之间连接着一些边(有向),保证无环,现在要求出从任意地方出发到所有点的最长路(出发点不一定相同) 原题: 题目描述 小明要去一个国家旅游.这个国家 ...

  6. LeetCode 802. 找到最终的安全状态(逆向图+拓扑排序)

    文章目录 1. 题目 2. 解题 1. 题目 在有向图中, 我们从某个节点和每个转向处开始, 沿着图的有向边走. 如果我们到达的节点是终点 (即它没有连出的有向边), 我们停止. 现在, 如果我们最后 ...

  7. 病毒virus(拓扑排序)

    ~目录啊~ 题目 思路 Code 题目 描述 有一天,小y突然发现自己的计算机感染了一种病毒!还好,小y发现这种病毒很弱,只是会把文档中的所有字母替换成其它字母,但并不改变顺序,也不会增加和删除字母. ...

  8. 病毒(virus) 题解 - 拓扑排序

    题目 有一天,小y突然发现自己的计算机感染了一种病毒!还好,小y发现这种病毒很弱,只是会把文档中的所有字母替换成其它字母,但并不改变顺序,也不会增加和删除字母. 现在怎么恢复原来的文档呢!小y很聪明, ...

  9. 题解报告:hihoCoder #1175:拓扑排序·二

    题目链接:https://hihocoder.com/problemset/problem/1175 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学 ...

最新文章

  1. 洛谷 1774 最接近神的人
  2. 深蓝学院的深度学习理论与实践课程:第二章
  3. 01_字符串处理------01_切分
  4. MySQL密码设置和重置,以及远程登入数据库
  5. python的翻译-用python实现百度翻译的示例代码
  6. 电容充放电原理图_干货 | 入门开关电源,这些原理图一定要读懂
  7. Python 数据分析与展示笔记3 -- Matplotlib 库基础
  8. 公共钥匙盒(排序CCF)
  9. oracle查询字段有list,java读取oracle表字段信息存到列表(LIST)中
  10. 【转】DICOM中几个判断图像方向的tag
  11. java 监控 配置 文件怎么打开_java实现文件变化监控的方法(推荐)
  12. github上markdown文件编写笔记
  13. springmvc错点集结
  14. mac php fpm 自动启动,mac系统,php-fpm加入开机启动项
  15. 前端之JQuery:JQuery文档操作
  16. 包含资金约束的多阶段报童模型
  17. Golang实战【IP池-自动切换IP爬虫】
  18. OV7725摄像头软件实现简单的二值化处理
  19. 用PS做一个简单的相机图标
  20. win7不用破解工具,最简单的去黑屏办法

热门文章

  1. abiword_AbiWord是适用于Windows,Linux和Mac的免费文字处理器
  2. Python是什么,Python简介
  3. 这24款效率办公神器,挺强的~
  4. 《敏捷软件开发-原则、模式与实践》-第一章 敏捷实践
  5. 戴维南定理和诺顿定理的验证
  6. Python遥感图像处理--开篇
  7. java bho_COM组件应用(3)——BHO学习
  8. 怎么搭建变装和带货直播间?变装直播带货怎么实现的
  9. Win 7 安装 IntelliJ IDEA 2019.2
  10. 高效解决虚拟机无法联网的问题