社区讨论

求助,有用回答者给二关

灌水区参与者 4已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lzwb4b6w
此快照首次捕获于
2024/08/16 14:07
2 年前
此快照最后确认于
2024/08/17 10:13
2 年前
查看原帖
首先是题面
在遥远的过去,某国为了国防安全,设计了一套加密算法。这套加密算法会首先将 26 个英文字母按任意顺序顺时针围成一个环,然后要传输的文本的每个字母都用这个环上的它的下一个字母替换。例如,假设 26 个英文字母排成的环为:qwertyuiopasdfghjklzxcvbnm,那么如果传输的文本为 manwhatcanisay,则加密后的文本为 qsmejsyvsmodsu。我们将这个环称为密钥。
假设你是这个国家敌国的间谍,你截获了对方的一段加密文本(设为 ),但是你不知道加密的密钥。你想要知道:将 通过某种密钥还原之后能得到的字典序最小的密文可能是什么?
紧接着是样例
CPP
3
qsmejsyvsmodsu
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxzy
输出
CPP
abcdebfgbchibj
bcdefghijklmnopqrstuvwxyza
bcdefghijklmnopqrstuvwxyaz
我的代码
CPP
#include<bits/stdc++.h> 
#define fast register int

using namespace std;

const int N=1e4+100;

int t,x;

bool vis[N],f[N];

string s;
char a[N],qwq='a';

signed main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	
	cin>>t;
	
	for (fast q=1;q<=t;q++){
		cin>>s;
	
		memset(vis,false,sizeof(vis));
		memset(f,false,sizeof(f));
		
		for (fast i=0;i<s.size();i++){
			x=int(s[i]);
			if (f[x]==false){
				for (fast j=0;j<26;j++){
					char ch=j+'a';
					if (vis[j+1]==false&&ch!=s[i]){
						a[x]=ch;
						vis[j+1]=true;
						f[x]=true;
						break;
					}
				}
			}
			cout<<a[x];
		}
//		for (fast i=97;i<=122;i++){
//			cout<<a[i];
//		}
		cout<<endl;
	}
	
	return 0;
}
我的输出
CPP
abcdebfgbchibj
badcfehgjilknmporqtsvuxwzy
badcfehgjilknmporqtsvuxwyz

回复

5 条回复,欢迎继续交流。

正在加载回复...