题目描述

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

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

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

输入格式

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

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

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

所有字母均为小写。

输出格式

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

样例输入

6
cebdbac
cac
ecd
dca
aba
bac
cedab

样例输出

abcde

分析

有很多人一开始看不懂题意,本人一开始也没看懂,之后仔细想了想就明白了。其实,题目就是给你一些按字典序排好的单词,然后让你用这些关系找出感染后的字母与原字母的关系。既然已知是字典序,那就简单了。

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
int n,mapp[27][27],du[27],bk[27],cnt;
map<char,char> dir;//用来存放对应关系,用普通数组也行
char ans[1000000];
string s[100000],str;
int main() {scanf("%d",&n);for (int i = 1;i <= n;i++) cin>>s[i];cin>>str;for (int i = 2;i <= n;i++) {int j=0;while (j<min(s[i].length(),s[i-1].length())) {//根据字典序的特征,从前往后第一个不同字母if (s[i][j]!=s[i-1][j]) {//排在前面的那个一定在后一个的后面. mapp[s[i-1][j]-'a'+1][s[i][j]-'a'+1]=1;//建图 du[s[i][j]-'a'+1]++;bk[s[i-1][j]-'a'+1]++;bk[s[i][j]-'a'+1]++;break;}j++;}}for (int i = 1;i <= 26;i++) {if (bk[i]) cnt++;//统计使用的字母数量,方便拓扑 }for (int i = 1;i <= cnt;i++) {int j=1;while (j<=26&&(du[j]||!bk[j])) j++;//入度为0且被用过了 if (j==26+1) {//没有入度为0且被用过的字母,给的字典有问题 printf("0");return 0;}dir[j-1+'a']='a'+i-1;du[j]=-1;for (int k = 1;k <= 26;k++) {if (mapp[j][k]) du[k]--;}}for (int i = 0;i < str.length();i++) {if (!dir[str[i]]) {//没有字母的对应,字典不完整 printf("0");return 0;}ans[i]=dir[str[i]];}printf("%s",ans);return 0;
}

对应解释应该在代码里说得很详细了,这里就不过多赘述。

病毒virus - 拓扑排序相关推荐

  1. C++解题报告:病毒(virus)——拓扑排序

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

  2. 病毒virus(拓扑排序)

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

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

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

  4. 【BZOJ-2938】病毒 Trie图 + 拓扑排序

    2938: [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 609  Solved: 318 [Submit][Status][ ...

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

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

  6. 病毒 (virus)

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

  7. HihoCoder - 1175 拓扑排序·二

    描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒.这事在校内BBS上立刻引起了大家的讨论,当然小Hi和小Ho也参与到了其中.从大家各自了解的情况中,小Hi和小Ho整理得到了以下的信息: 校园 ...

  8. hihoCoder 1175 拓扑排序

    hihoCoder 1175 拓扑排序 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒.这事在校内BBS上立刻引起了大家的讨论,当然小Hi和小Ho也参与到了其中.从大家各自了解的情况中,小 ...

  9. 图论 —— AOV 网与拓扑排序

    [AOV网] 日常生活中,一项大的工程可以看作是由若干个子工程组成的集合,这些子工程之间必定存在一定的先后顺序,即某些子工程必须在其他的一些子工程完成后才能开始. 我们用有向图来表现子工程之间的先后关 ...

最新文章

  1. ObservableCollection排序
  2. OpenCASCADE:拓扑 API之历史支持
  3. /etc/network/interfaces
  4. [渝粤教育] 中国地质大学 电力系统保护原理 复习题 (2)
  5. python实现计算最少完美平方数
  6. 编译源码时出现 Checking API: checkapi-last (unknown): error 17解决方法
  7. go语言报错:main redeclared in this block
  8. [转]DataGridView显示行号的几种方法
  9. 简单的 Nodejs jade 实现Hello world
  10. 无人机航测流程—市县城镇开发边界内1:500地形图
  11. Food Webs - 网络中度及集聚系数实现
  12. Transaction-based classification and detection approach for Ethereum smart contract
  13. Android设置全屏代码
  14. 必要的先决条件安装失败_先决条件
  15. 手机HTML拼图验证,jQuery支持移动端的滑动块拼图验证插件
  16. HDU 3236 Gift Hunting (程序猿的哄女朋友方式)
  17. 【POJ】2676-Sudoku 【51Nod】1211-数独(DFS)
  18. [生存志] 第60节 论语章节概览
  19. 公网SSH远程树莓派【内网穿透】 1-2
  20. 孙陶然:不要轻易开始创业

热门文章

  1. 【工大SCIR论文解读】WWW20 关键词生成提升电商会话推荐
  2. PDF文件太大怎么压缩?用这个方法能够一键瘦身
  3. 无刷电机和桨叶的选择
  4. 【论文阅读】Feature Denoising for Improving Adversarial Robustness
  5. 笑抽了~~关于程序员的爆笑gif图片
  6. 《用Castor 处理XML文档》学习笔记
  7. 指向性麦克风--心形麦克风设计(五)
  8. 使用useState因异步导致数据不能及时更新的问题
  9. 【关于谷歌浏览器 无法翻译此网页的解决方法】
  10. java常用英语单词