列表

详情


NC208618. 破解密码

描述

众所周知抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。

现在你正在检测T()个随机加密服务器,随机加密服务器有一个密钥长度为K(),只由大写字母’A‘~'Z'组成,且每个字符在密钥中只出现一次。服务器只提供一个服务:输入一个K进制数x(我们不妨称之为加密数字),随机在[1,x]生成一个K进制数并且加密的返回。加密规则是:对于K进制数中的某一位为x,用密钥中的第x个字符替代。例如当加密密钥为CODE,加密数字为1230(十进制数),加密字符串为ODEC。

现在你抓包到了个加密数字(保证加密数字为随机生成)和加密字符串(保证加密数字小于十进制下的或者加密数字等于-1),但是由于某种不明的技术原因部分加密数字损坏了显示成了-1,求是否能求出密钥。如果能求出则输出密钥,不能则输出-1。

输入描述

第一行一个数T,表示有T个加密服务器。

对于每组数据,接下来一行一个数K,表示密钥长度。

接下来行,每行包括一个k进制数表示加密数字(加密数字如包含字符,均为小写字符),或者-1表示加密 数字损坏。接着一个字符串表示加密字符。

输出描述

对于每个服务器输出"Case #x: y",x表示这是第几个服务器,y表示答案,一个表示密钥的字符串,或者-1。

示例1

输入:

<a href="http://nowcoder.oss-cn-hangzhou.aliyuncs.com/files/20200702/sample.in">下载链接</a>

输出:

<a href="http://nowcoder.oss-cn-hangzhou.aliyuncs.com/files/20200702/sample.out">下载链接</a>

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 303ms, 内存消耗: 412K, 提交时间: 2020-07-03 12:09:40

#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

#define PII pair<ll,ll>
#define fr first
#define sc second
#define mp make_pair
#define pb push_back

const ll N=2e4;

ll k;
ll cnt[27],vis[27];
char fnt;
vector<PII> v;
bool cmp(PII a,PII b){
	return a>b;
}

int main(){
	// freopen("11.in","r",stdin);
	ll T=input(),cas=0;
	while(T--){
		memset(cnt,0,sizeof(cnt));
		memset(vis,0,sizeof(vis));
		v.clear();
		k=input();
		char s1[N],s2[N];
		for(ll i=1;i<=N;i++){
			scanf("%s%s",s1,s2);

			cnt[s2[0]-'A']++;
			ll len=strlen(s2);
			for(ll j=0;j<len;j++)
				vis[s2[j]-'A']=1;
		}

		for(ll i=0;i<26;i++){
			if(cnt[i]) v.pb(mp(cnt[i],i));
			if(!cnt[i]&&vis[i]) fnt=(char)(i+'A');
		}

		sort(v.begin(),v.end(),cmp);
		
		printf("Case #%d: ",++cas);
		printf("%c",fnt);
		for(auto t:v){
			printf("%c",(char)(t.sc+'A'));
		}
		printf("\n");
	}
}

上一题