04:病毒

总时间限制: 
1000ms

内存限制: 
65535kB
描述

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

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

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

输入
virus.in
第一行为整数K(≤50000),表示字典中的单词个数。
以下K行,是被病毒感染了的字典,每行一个单词。
最后一行是需要你恢复的一串字母。
所有字母均为小写。
输出
virus.out
输出仅一行,为恢复后的一串字母。当然也有可能出现字典不完整、甚至字典是错的情况,这时请输出一个0。
样例输入
6
cebdbac
cac
ecd
dca
aba
bac
cedab
样例输出
abcde
 #include <iostream>
using namespace std; #include <cstdio>
#include <cstdlib>
#include <cmath> int qm[],sd[],dy[];// qm记录入度
string s[];
int next[],back[],last[];//邻接表元素
bool yt[][];// 判断字母应该出现的顺序
int tot,cmax;
bool cx[]; void add_edge(int a,int b)
{
tot++;
next[tot]=b;// b 必须要在 a 之后才能出现
back[tot]=last[a];// 指针指向下一条边
last[a]=tot;// 相当于head指针
} void dfs(int x,int t)// t表示字母个数
{
if (t>sd[x]) sd[x]=t; //sd表示与x相关的字母数量
int i=last[x];
while (i!=)// 枚举与x+96相关的所有字母
{
int v=next[i];
if (sd[v]<=t) dfs(v,t+);
i=back[i];
}
} void error()
{
cout<<"";
exit ();// 强制退出程序 相当于return 0(不过要比return 0凶一点嘻嘻);
} int main()
{
int k;
cin>>k;
for (int i=; i<=k; i++)
getline(cin,s[i]);
for (int i=; i<=k; i++)// 因为判断是把当前字符串与上一个字符串进行比较
{
int l1=s[i-].size();
int l2=s[i].size();
for (int j=; j<=min(l1,l2)-; j++) //比较到较短的长度
{
int t1=s[i-][j]-;
int t2=s[i][j]-;
cmax=max(t1,max(t2,cmax));// 找到所有输入的最大值
if (t1==t2) continue;
if (yt[t2][t1]) error();//t1必须在t2之前
qm[t2]++;// 入度 拓扑排序
yt[t1][t2]=true;
add_edge(t1,t2);
break;
// 如果找到t1<t2的元素直接退出 因为字典序只比较第一个不相同的元素
}
}
for (int i=; i<=cmax; i++)
{
if (qm[i]==) //如果他的入度为0
dfs(i,);
}//统计与所有字母相关的字母的数量
string que,ans="";
getline(cin,que);// 输入待处理的字符串
for (int i=; i<=que.size()-; i++)
{
if (cx[sd[que[i]-]]) error();
cx[sd[que[i]-]]=true; //进行判重
if (sd[que[i]-]==) error();//如果没有找到可以匹配的元素
ans=ans+(char (sd[que[i]-]+));
}
cout<<ans;
return ;
}

没太看懂

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<cstdlib>
#include<cmath> const int MAXN=;
using namespace std; string a[MAXN];
int maxnlength; struct node
{
int u;
int v;
int w;
int next;
}edge[MAXN]; int rudu[MAXN];
int head[MAXN];
int num=;
int ans[];//保存拓扑排序的结果
int now=;
int n;
int maxnchar=;
int map[][]; void topsort()
{
stack<int>s;
for(int i=;i<=maxnchar;i++)
{
if(rudu[i]==)
{
s.push(i);
ans[now]=i;
now++;
}
}
int flag=;
while(s.size()==)
{
if(s.size()>)
{
flag=;
break;
}
int p=s.top();
s.pop();
for(int i=head[p];i!=-;i=edge[i].next)
{
rudu[edge[i].v]--;
if(rudu[edge[i].v]==)
{
s.push(edge[i].v);
ans[now]=edge[i].v;
now++;
}
}
}
if(flag==)
{
printf("0\n");
exit();
}
} int main()
{ scanf("%d",&n);
for(int i=;i<=n;i++)head[i]=-;
for(int i=;i<=n;i++)
{
cin>>a[i];
if(a[i].length()>maxnlength)
maxnlength=a[i].length();
for(int j=;j<=a[i].length();j++)
{
if(a[i][j]->maxnchar)
maxnchar=a[i][j]-;
}
}
int flag2=;
for(int i=;i<=n;i++)
{
int j=i-;
for(int k=;k<=min(a[i].length()-,a[j].length()-);k++)
{
if(a[j][k]!=a[i][k])
{
if(map[a[j][k]-][a[i][k]-]==||map[a[i][k]-][a[j][k]-]==)
{
printf("0\n");
return ;
}
edge[num].u=a[j][k]-;
edge[num].v=a[i][k]-;
edge[num].next=head[edge[num].u];
head[edge[num].u]=num++;
rudu[a[i][k]-]++;
flag2=;
map[a[j][k]-][a[i][k]-]=;
break;
}
}
//if(flag2==1)break;
}
topsort();
char sr[];
char huiche[];
gets(huiche);
gets(sr);
int l=strlen(sr);
//int srl=sr.length();
for(int i=;i<=l;i++)
{
if(sr[i]->maxnchar)
{
printf("0\n");
return ;
}
}
for(int i=;i<=l;i++)
{
for(int j=;j<=now-;j++)
{
if(ans[j]==sr[i]-)
{
printf("%c",char(j+));
}
}
}
return ;
}

病毒 x的更多相关文章

  1. android手机登录时遇到“QQ安全登录发现病毒”解决

    android手机作为开源系统非常容易感染病毒,有时候我们会经常遇到手机QQ登录时检测到app被感染,一般情况是由手机感染病毒所引起的,安装腾讯管家后只能检测病毒和卸载感染病毒的软件,不能清除病毒.解 ...

  2. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

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

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

  4. 病毒四度升级:安天AVL Team揭露一例跨期两年的电信诈骗进化史

    自2014年9月起,安天AVL移动安全团队持续检测到一类基于Android移动平台的间谍类病毒,病毒样本大多伪装成名为"最高人民检察院"的应用.经过反编译逆向分析以及长期的跟踪调查 ...

  5. 当攻击者熟读兵法,Camouflage病毒实战演示暗度陈仓之计

    "明修栈道,暗度陈仓"的典故许多人都听说过,该典故出自楚汉争霸时期,刘邦意图进入关中,需要攻下关中咽喉之地--陈仓.韩信献出一计:表面上浩浩荡荡地修复通往陈仓的栈道以迷惑陈仓守将, ...

  6. Trick蠕虫病毒来袭!幕后主使竟是一名高中生“黑客”!

    黑客一直是美国电影中的重要元素,很多经典大片中都有黑客的身影,如战争游戏.黑客帝国等.电影中黑客总是神通广大.行侠仗义,<战争游戏>中的年轻黑客大卫•莱特曼利用黑客技术避免引爆核武器,&l ...

  7. 安天AVL联合小米MIUI首擒顽固病毒“不死鸟”

    不死鸟作为希腊神话中的一种怪物,拥有不断再生的能力,每当寿限将至时,它会在巢穴中自焚,并在三天后重新复活.就在近期,安天AVL移动安全团队和小米MIUI安全中心发现了病毒界的“不死鸟”,其顽固程度之深 ...

  8. 【HDU2896】病毒侵袭 AC自动机

    [HDU2896]病毒侵袭 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋--我们能在有生之年看到500年 ...

  9. 你的应用是如何被替换的,App劫持病毒剖析

    一.App劫持病毒介绍 App劫持是指执行流程被重定向,又可分为Activity劫持.安装劫持.流量劫持.函数执行劫持等.本文将对近期利用Acticity劫持和安装劫持的病毒进行分析. 二.Activ ...

  10. 谷歌chrome浏览器www.tradeadexchange.com广告弹窗跳转劫持病毒

    近期大量网友出现chrome浏览器被劫持的情况,表现如下:           ·  点击(访问)任意网站任意链接均有概率弹出www.tradeadexchange.com.           ·  ...

随机推荐

  1. Python_Onlineh_Hmework(基础篇,持续更新中...)

    1 递归 1.1 定义一个函数,求一个数的阶乘 def func(x): if x == 2: return 2 else: return x*func(x-1) a = func(4) print( ...

  2. excel常用公式--逻辑运算类

    if:  IF(logical_test, value_if_true, [value_if_false]). and: 逻辑判断,相当于“并”. or: 逻辑判断,相当于“或”.

  3. Maven - 配置setting.xml

    1.配置本地库路径 <localRepository>C:/fyliu/mvn/repo</localRepository> 2.配置中央仓库 <mirror> & ...

  4. UDP协议&socketserver模块

    UDP协议&socketserver模块 一.UDP协议 1.1 UDP实现简单通信 服务器 ------------------------------------------------- ...

  5. H. A Cache Simulator

    Cache memories have been used widely in current microprocessor systems. In this problem, you are ask ...

  6. phpstudy配置多站点

    1.打开vhosts.conf文件     目录 Apache/conf/vhosts.conf #开启apache的vhost模块 (此模块默认是关闭的,去掉前面的#号) LoadModule vh ...

  7. var与let变量for遍历的问题

    var Liarry = document.getElementsByTagName('li'); /**方法一*描述:自执行函数,将变量当参数传入(闭包的思想,保存当前的值).*/ for (var ...

  8. spring-cloud学习BUG

    1.com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: c ...

  9. 1.Java 字符分割

    使用方法 性能比较 使用方法 或|,点.,加+,乘*,在字符串中出现时,如果这个字符串需要被split,则split时候,需要在前面加两个反斜杠. 与&,在split时候,不需要转义. 一.j ...

  10. 新手 vim常用命令总结 (转)

    转自 https://www.cnblogs.com/yangjig/p/6014198.html 在命令状态下对当前行用== (连按=两次), 或对多行用n==(n是自然数)表示自动缩进从当前行起的 ...