C++解题报告:病毒(virus)——拓扑排序
题目描述
有一天,小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)——拓扑排序相关推荐
- 病毒virus - 拓扑排序
题目描述 有一天,小y突然发现自己的计算机感染了一种病毒!还好,小y发现这种病毒很弱,只是会把文档中的所有字母替换成其它字母,但并不改变顺序,也不会增加和删除字母. 现在怎么恢复原来的文档呢!小y很聪 ...
- 2021字节跳动校招秋招算法面试真题解题报告--leetcode148 排序链表,内含7种语言答案
148.排序链表 1.题目描述 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序 2.解题报告 针对nlogn的排序算法,主要有快速排序,归并排序和堆排序.其中,堆排序利用了数 ...
- UVALive 6467 Strahler Order 拓扑排序
这题是今天下午BNU SUMMER TRAINING的C题 是队友给的解题思路,用拓扑排序然后就可以了 最后是3A 其中两次RE竟然是因为: scanf("%d",mm); ORZ ...
- 【拓扑排序】【DP】奖金(ssl 1325)
奖金 ssl 1325 题目大意: 有n个人,某个人要比另外一个人的工资高(工资最低为100,最少多1元),问最少发多少工资 原题: 题目描述 由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,Y ...
- 【拓扑排序】【DP】旅行计划(luogu 1137)
旅行计划 luogu 1137 题目大意: 有一堆点,之间连接着一些边(有向),保证无环,现在要求出从任意地方出发到所有点的最长路(出发点不一定相同) 原题: 题目描述 小明要去一个国家旅游.这个国家 ...
- LeetCode 802. 找到最终的安全状态(逆向图+拓扑排序)
文章目录 1. 题目 2. 解题 1. 题目 在有向图中, 我们从某个节点和每个转向处开始, 沿着图的有向边走. 如果我们到达的节点是终点 (即它没有连出的有向边), 我们停止. 现在, 如果我们最后 ...
- 病毒virus(拓扑排序)
~目录啊~ 题目 思路 Code 题目 描述 有一天,小y突然发现自己的计算机感染了一种病毒!还好,小y发现这种病毒很弱,只是会把文档中的所有字母替换成其它字母,但并不改变顺序,也不会增加和删除字母. ...
- 病毒(virus) 题解 - 拓扑排序
题目 有一天,小y突然发现自己的计算机感染了一种病毒!还好,小y发现这种病毒很弱,只是会把文档中的所有字母替换成其它字母,但并不改变顺序,也不会增加和删除字母. 现在怎么恢复原来的文档呢!小y很聪明, ...
- 题解报告:hihoCoder #1175:拓扑排序·二
题目链接:https://hihocoder.com/problemset/problem/1175 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学 ...
最新文章
- 洛谷 1774 最接近神的人
- 深蓝学院的深度学习理论与实践课程:第二章
- 01_字符串处理------01_切分
- MySQL密码设置和重置,以及远程登入数据库
- python的翻译-用python实现百度翻译的示例代码
- 电容充放电原理图_干货 | 入门开关电源,这些原理图一定要读懂
- Python 数据分析与展示笔记3 -- Matplotlib 库基础
- 公共钥匙盒(排序CCF)
- oracle查询字段有list,java读取oracle表字段信息存到列表(LIST)中
- 【转】DICOM中几个判断图像方向的tag
- java 监控 配置 文件怎么打开_java实现文件变化监控的方法(推荐)
- github上markdown文件编写笔记
- springmvc错点集结
- mac php fpm 自动启动,mac系统,php-fpm加入开机启动项
- 前端之JQuery:JQuery文档操作
- 包含资金约束的多阶段报童模型
- Golang实战【IP池-自动切换IP爬虫】
- OV7725摄像头软件实现简单的二值化处理
- 用PS做一个简单的相机图标
- win7不用破解工具,最简单的去黑屏办法