【问题描述】
  有一天,小y突然发现自己的计算机感染了一种病毒!还好,小y发现这种病毒很弱,只是会把文档中的所有字母替换成其它字母,但并不改变顺序,也不会增加和删除字母。
  现在怎么恢复原来的文档呢!小y很聪明,他在其他没有感染病毒的机器上,生成了一个由若干单词构成的字典,字典中的单词是按照字母顺序排列的,他把这个文件拷贝到自己的机器里,故意让它感染上病毒,他想利用这个字典文件原来的有序性,找到病毒替换字母的规律,再用来恢复其它文档。
  现在你的任务是:告诉你被病毒感染了的字典,要你恢复一个字母串。
【输入格式】virus.in
  第一行为整数K(≤50000),表示字典中的单词个数。
  以下K行,是被病毒感染了的字典,每行一个单词。
  最后一行是需要你恢复的一串字母。
  所有字母均为小写。
【输出格式】virus.out
   输出仅一行,为恢复后的一串字母。当然也有可能出现字典不完整、甚至字典是错的情况,这时请输出一个0。
【输入样例】
  6
  cebdbac
  cac
  ecd
  dca
  aba
  bac
  cedab
【输出样例】
  abcde
 终于摆脱了网上正解的束缚!用自己的方法终于改对辣!在此感谢ljx dalao的鼎力帮助!!!✿✿ヽ(°▽°)ノ✿
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int f[125],n,s,k,t,in[125],num,top[125][30],minn,m,r[125];
char c[5005],dic[50005][505],z[30],now,zd[30];
int main()
{freopen("virus.in","r",stdin);freopen("virus.out","w",stdout);scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%s",dic[i]);if (i>1){ int len1=strlen(dic[i-1]),len2=strlen(dic[i]);for (int t=0; t<=min(len1,len2)-1;t++)//直到两个字符串中较短的那个结束为止 因为不能将空字符和字母连起来 {if (dic[i][t]!=dic[i-1][t]){top[dic[i-1][t]][++top[dic[i-1][t]][0]]=dic[i][t];in[dic[i][t]]++;break;//不要忘记break,每次只取一个字母 }}}for (int j=0;j<strlen(dic[i]);j++){f[dic[i][j]]++;if (f[dic[i][j]]==1) zd[++num]=dic[i][j];//统计共出现了多少不重复的字母 zd保存 }}scanf("%s",c); t=0;memset(f,0,sizeof(f));//上面的f是用来保存字母出现的次数 下面的f用来判断字母是否用过 while (s<num){int ss=0;for (int i=1;i<=num;i++)if (in[zd[i]]==0){ss++; s++; z[++t]=zd[i];in[zd[i]]=0x7fffffff;}if (ss!=1) {printf("0"); return 0;}//每一轮只能有且只有一个入度为0的点,即拓扑序列是唯一的 while (t!=0){now=z[t--];//取出栈顶元素 栈顶向下移 r[now]=++m;//r保存该字母的序号 for (int i=1;i<=top[now][0];i++)in[top[now][i]]--;//去掉相连的边 }}sort(zd+1,zd+num+1);//使zd变成字典序 for (int i=0;i<strlen(c);i++)if (c[i]>zd[num]||c[i]<zd[1]) {printf("0");return 0;}//这里默认所给单词中所有出现的字母都是连续的 若需要翻译的字符串中出现比范围内字母大或小的则字典不完整 for (int i=0;i<strlen(c);i++)printf("%c",zd[r[c[i]]]);fclose(stdin); fclose(stdout);return 0;
}

拓扑排序 病毒virus相关推荐

  1. 病毒virus(拓扑排序)

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

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

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

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

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

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

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

  5. 病毒 (virus)

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

  6. HihoCoder - 1175 拓扑排序·二

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

  7. hihoCoder 1175 拓扑排序

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

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

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

  9. 【图论】有向无环图的拓扑排序

    1. 引言 有向无环图(Directed Acyclic Graph, DAG)是有向图的一种,字面意思的理解就是图中没有环.常常被用来表示事件之间的驱动依赖关系,管理任务之间的调度.拓扑排序是对DA ...

最新文章

  1. 一作解读Gut:人体最初的微生物起源与生殖健康
  2. java二次封装_基于OKhttp+Rxjava2+Retrofit进行二次封装
  3. 用VS2012或VS2013在win7下编写的程序在XP下运行就出现“不是有效的win32应用程序
  4. 50行代码串行Promise,koa洋葱模型原来这么有趣?
  5. LeetCode 463. Island Perimeter
  6. 打开windows批处理大门
  7. 带透明png转换成c数组
  8. windows server 2008配置之AD域服务器 2
  9. Android 存储学习之使用SharedPreference保存文件
  10. 软件开发人月成本估算方法
  11. 怎样用matlab画斜条纹图案,CorelDRAW制作简单的均匀倾斜条纹
  12. 第十二周助教心得体会
  13. 【python与excel】
  14. 2万字 + 50 张图,细说 JVM 内存分布、内存对齐、压缩指针
  15. 猜猜我是谁(猜数游戏)
  16. 概率图模型(PGM)综述-by MIT 林达华博士
  17. android修改checkbox样式边框颜色
  18. JavaScript(JS)的DOM对象(JS的Document对象)----什么是DOM对象?
  19. 全国IT公司红黑榜排名(更新时间11月8日)
  20. 大咖养成记 一个拥有66万粉丝的自媒体

热门文章

  1. 灰帽子里面的pydbg代码
  2. 解决:QSqlQuery出现parameter count mismatch
  3. c语言已知三个点坐标求三角形面积公式,c语言编程,求三角形面积公式?
  4. 1113123123123
  5. PLSQL ROWCOUNT
  6. 数据结构——学习笔记——入门必看【建议收藏】
  7. 【SVN】Clean failed to process the following paths:
  8. 1Z201060、建设工程项目管理规划的内容和编制方法
  9. Lenovo ThinkSystem SR650服务器做raid
  10. 利用Java实现端口扫描器