病毒 x

04:病毒

总时间限制: 
1000ms

内存限制: 
65535kB
描述

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

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

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

输入
virus.in
第一行为整数K(≤50000),表示字典中的单词个数。
以下K行,是被病毒感染了的字典,每行一个单词。
最后一行是需要你恢复的一串字母。
所有字母均为小写。
输出
virus.out
输出仅一行,为恢复后的一串字母。当然也有可能出现字典不完整、甚至字典是错的情况,这时请输出一个0。
样例输入
6
cebdbac
cac
ecd
dca
aba
bac
cedab
样例输出
abcde
 1 #include <iostream>
 2 using namespace std;
 3
 4 #include <cstdio>
 5 #include <cstdlib>
 6 #include <cmath>
 7
 8 int qm[27],sd[27],dy[27];// qm记录入度
 9 string s[50001];
10 int next[1000],back[1000],last[1000];//邻接表元素
11 bool yt[27][27];// 判断字母应该出现的顺序
12 int tot,cmax;
13 bool cx[27];
14
15 void add_edge(int a,int b)
16 {
17     tot++;
18     next[tot]=b;// b 必须要在 a 之后才能出现
19     back[tot]=last[a];// 指针指向下一条边
20     last[a]=tot;// 相当于head指针
21 }
22
23 void dfs(int x,int t)// t表示字母个数
24 {
25     if (t>sd[x]) sd[x]=t; //sd表示与x相关的字母数量
26     int i=last[x];
27     while (i!=0)// 枚举与x+96相关的所有字母
28     {
29         int v=next[i];
30         if (sd[v]<=t) dfs(v,t+1);
31         i=back[i];
32     }
33 }
34
35 void error()
36 {
37     cout<<"0";
38     exit (0);// 退出程序 相当于return 0;
39 }
40
41 int main()
42 {
43     int k;
44     cin>>k;
45     for (int i=0; i<=k; i++)
46         getline(cin,s[i]);
47     for (int i=2; i<=k; i++)// 因为判断是把当前字符串与上一个字符串进行比较
48     {
49         int l1=s[i-1].size();
50         int l2=s[i].size();
51         for (int j=0; j<=min(l1,l2)-1; j++) //比较到较短的长度
52         {
53             int t1=s[i-1][j]-96;
54             int t2=s[i][j]-96;
55             cmax=max(t1,max(t2,cmax));// 找到所有输入的最大值
56             if (t1==t2) continue;
57             if (yt[t2][t1]) error();//t1必须在t2之前
58             qm[t2]++;// 入度   拓扑排序
59             yt[t1][t2]=true;
60             add_edge(t1,t2);
61             break;
62             // 如果找到t1<t2的元素直接退出 因为字典序只比较第一个不相同的元素
63         }
64     }
65     for (int i=1; i<=cmax; i++)
66     {
67         if (qm[i]==0)  //如果他的入度为0
68         dfs(i,1);
69     }//统计与所有字母相关的字母的数量
70     string que,ans="";
71     getline(cin,que);// 输入待处理的字符串
72      for (int i=0; i<=que.size()-1; i++)
73     {
74         if (cx[sd[que[i]-96]]) error();
75         cx[sd[que[i]-96]]=true; //进行判重
76           if (sd[que[i]-96]==0) error();//如果没有找到可以匹配的元素
77         ans=ans+(char (sd[que[i]-96]+96));
78     }
79     cout<<ans;
80     return 0;
81 }

没太看懂

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<stack>
  5 #include<cstdlib>
  6 #include<cmath>
  7
  8 const int MAXN=50000;
  9 using namespace std;
 10
 11 string a[MAXN];
 12 int maxnlength;
 13
 14 struct node
 15 {
 16     int u;
 17     int v;
 18     int w;
 19     int next;
 20 }edge[MAXN];
 21
 22 int rudu[MAXN];
 23 int head[MAXN];
 24 int num=1;
 25 int ans[10001];//保存拓扑排序的结果
 26 int now=1;
 27 int n;
 28 int maxnchar=0;
 29 int map[101][101];
 30
 31 void topsort()
 32 {
 33     stack<int>s;
 34     for(int i=1;i<=maxnchar;i++)
 35     {
 36         if(rudu[i]==0)
 37         {
 38             s.push(i);
 39             ans[now]=i;
 40             now++;
 41         }
 42     }
 43     int flag=0;
 44     while(s.size()==1)
 45     {
 46         if(s.size()>1)
 47         {
 48             flag=1;
 49             break;
 50         }
 51         int p=s.top();
 52         s.pop();
 53         for(int i=head[p];i!=-1;i=edge[i].next)
 54         {
 55             rudu[edge[i].v]--;
 56             if(rudu[edge[i].v]==0)
 57             {
 58                 s.push(edge[i].v);
 59                 ans[now]=edge[i].v;
 60                 now++;
 61             }
 62         }
 63     }
 64     if(flag==1)
 65     {
 66         printf("0\n");
 67         exit(0);
 68     }
 69 }
 70
 71 int main()
 72 {
 73
 74     scanf("%d",&n);
 75     for(int i=1;i<=n;i++)head[i]=-1;
 76     for(int i=1;i<=n;i++)
 77     {
 78         cin>>a[i];
 79         if(a[i].length()>maxnlength)
 80         maxnlength=a[i].length();
 81         for(int j=1;j<=a[i].length();j++)
 82         {
 83             if(a[i][j]-96>maxnchar)
 84             maxnchar=a[i][j]-96;
 85         }
 86     }
 87     int flag2=0;
 88     for(int i=2;i<=n;i++)
 89     {
 90         int j=i-1;
 91             for(int k=0;k<=min(a[i].length()-1,a[j].length()-1);k++)
 92             {
 93                 if(a[j][k]!=a[i][k])
 94                 {
 95                     if(map[a[j][k]-96][a[i][k]-96]==1||map[a[i][k]-96][a[j][k]-96]==1)
 96                     {
 97                         printf("0\n");
 98                         return 0;
 99                     }
100                     edge[num].u=a[j][k]-96;
101                     edge[num].v=a[i][k]-96;
102                     edge[num].next=head[edge[num].u];
103                     head[edge[num].u]=num++;
104                     rudu[a[i][k]-96]++;
105                     flag2=1;
106                     map[a[j][k]-96][a[i][k]-96]=1;
107                     break;
108                 }
109             }
110             //if(flag2==1)break;
111     }
112     topsort();
113     char sr[101];
114     char huiche[1];
115     gets(huiche);
116     gets(sr);
117     int l=strlen(sr);
118     //int srl=sr.length();
119     for(int i=0;i<=l;i++)
120     {
121         if(sr[i]-96>maxnchar)
122         {
123             printf("0\n");
124             return 0;
125         }
126     }
127     for(int i=0;i<=l;i++)
128     {
129         for(int j=1;j<=now-1;j++)
130         {
131             if(ans[j]==sr[i]-96)
132             {
133                 printf("%c",char(j+96));
134             }
135         }
136     }
137     return 0;
138 }
时间: 2024-12-29 06:57:11

病毒 x的相关文章

下了个蓝屏代码查看工具,就中病毒了。。。什么鬼病毒,竟然还是用的VBS

扫描所有盘下面的html文件,加入VBS脚本...真是奇葩,多少年前的病毒了... http://files.cnblogs.com/files/guangshan/lpdmcxq.rar 这个是病毒链接,下载地址也在里面. 原理是为所有的html文件增加一段脚本: </div><SCRIPT Language=VBScript><!-- DropFileName = "svchost.exe" WriteData = "4D5A90000300

&quot;WannaCry&quot;勒索病毒用户处置指南

"WannaCry"勒索病毒用户处置指南 原文: http://mp.weixin.qq.com/s/ExsribKum9-AN1ToT10Zog 前言:北京时间2017年5月12日晚,勒索软件"WannaCry"感染事件爆发,全球范围内99个国家遭到大规模网络攻击,被攻击者电脑中的文件被加密,被要求支付比特币以解密文件:众多行业受到影响,比如英国的NHS服务,导致至少40家医疗机构内网被攻陷,电脑被加密勒索:而我国众多行业也是如此,其中又以教育网最为显著,导致部分

与linux 病毒的一次接触

环境说明: 1.linux 版本信息 Linux version 2.6.18-308.el5PAE ([email protected]) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)) #1 SMP Fri Jan 27 17:40:09 EST 2012 2.两台服务器安装有双机软件 ,linux版本相同 现象: 用户反映双机软件有问题了,远程连过去奇慢无比,后来他们机房的人员发现这两台服务器异常,拨掉其中一台的网线后,网络恢复正常. 具体检

易宝典文章——玩转Office 365中的Exchange Online服务 之二十八 怎样过滤病毒木马邮件

病毒.木马等恶意代码已经充斥着整个Internet.其传播途径也非常广泛,其中有一种途径就是通过电子邮件进行传播.可能的情况如下: >邮件自身是通过病毒发出的,并携带病毒自身或变种: >邮件是通过发件人发出的,但是由于发件人的设备感染了病毒,该病毒自动随邮件发出: >发件人发送邮件时,主动添加了附件,而附件文件中带有病毒等.对于收件人来讲,如果接收到这些携带恶意代码的邮件后,而本地又没有最新的.有效的防恶意代码工具,那么就会被随之被感染病毒或遭到木马入侵等.Exchange Online

手机卫士11_ 自定义控件_缓存清理_病毒库更新

拷贝安卓源码中的逻辑,可以考虑先创建一个小项目实现以下效果 1,病毒数据库的自动更新(连接网络,然后获取特征码保存到数据库?) ①工程师发现病毒apk,获取到它的特征码发布到服务器上 通过 MD5 或者ASH1获取特征码 ②客户端杀毒软件下载特征码(可能是 JSON串)到本地客户端 (在打开软件的时候还是打开查杀界面的时候?其实都不适合,应该开启一个服务去定期更新数据库,访问病毒更新特征码地址) 定期更新,timer和timertask,一般一个小时更新一次(测试的时候写短一点) 连接服务器:U

安卓平台病毒猖獗 日感染15000台

金山手机毒霸今日发布的安卓手机安全报告称,每日监测到1.5万部安卓设备被病毒感染.首当其冲的是山寨手机.水货手机和刷第三方Rom包的手机,病毒检出率持续增加,已成为病毒感染的最主要渠道,超过了手机应用程序和应用商店. 为什么安卓手机被黑机率总是很高,安全专家曲子龙对此表示:"安卓APP不需要授权就直接可以装载,不明的APP来源很大程度上决定了大量病毒的产生."黑客一般挂载木马的模式大多还徘徊在软件后门的基础上,放到手机上就是捆绑木马在手机应用上.

最近碰到了一个病毒木马:virus.win32.ramnit.B

由于 使用了 简单游 平台上的挂机工具: 番茄-自动人机对战免费版1217  ,使用了很久,头段时间家里电脑 360提示有病毒,本来我一直忽略的,但 我扫描了一下,大量的这个木马,于是 吧 简单游卸载了,全盘扫描,杀毒,修复了许多文件.许多文件被感染,文件大小都变了,还好 360 可以修复感染文件. 这一次,我是用公司电脑,再次 尝试使用 简单游 的挂机工具,没想到 依旧 是这个病毒 virus.win32.ramnit.B ,又是感染了大量的文件.360 居然没有提醒,还好 我清理电脑垃圾 顺

挨踢观察:勒索病毒又要瞄准移动端了?移动支付安全该怎么办?

5月12日至今,肆虐全球的WannaCry勒索病毒让全球网民度过了灰暗恐慌的一周,也让诸多普通网民真正意识到,网络安全并非只是网络公司或安全公司的事了,自己也是网络安全中的一员.据了解,WannaCry勒索病毒是黑客组织"影子经纪人"外泄的黑客工具,而该组织日前再次发出警告,将于今年6月披露更多的黑客工具,主要瞄准路由器.浏览器.Windows 10.或者手机!这就是说,第一波的勒索病毒主要针对Windows系统,而接下来的将会涉及到我们每个人的手机! 在写文章前,我想先问一个问题:你

今天中了一个脚本病毒。把我的所有 html 加了 vbs 脚本,WriteData 是什么鬼?

今天中了一个脚本病毒.把我的所有 html 加了 vbs 脚本: WriteData 是什么鬼? <SCRIPT Language=VBScript><!-- DropFileName = "svchost.exe" WriteData = "4D5A90000300000004000000FFFF0000B8000000000000004000000000000000000000000000000000000000000000000000000000000

HDU 2065 红色病毒 指数型母函数+泰勒公式

医学界发现的新病毒因其蔓延速度和Internet上传播的"红色病毒"不相上下,被称为"红色病毒",经研究发现,该病毒及其变种的DNA的一条单链中,胞嘧啶,腺嘧啶均是成对出现的. 现在有一长度为N的字符串,满足一下条件: (1) 字符串仅由A,B,C,D四个字母组成; (2) A出现偶数次(也可以不出现); (3) C出现偶数次(也可以不出现); 计算满足条件的字符串个数. 当N=2时,所有满足条件的字符串有如下6个:BB,BD,DB,DD,AA,CC. 由于这个数据