求助,有用回答者给二关
  • 板块灌水区
  • 楼主fluhang_
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/8/16 14:05
  • 上次更新2024/8/17 10:13:37
查看原帖
求助,有用回答者给二关
1072112
fluhang_楼主2024/8/16 14:05

首先是题面

在遥远的过去,某国为了国防安全,设计了一套加密算法。这套加密算法会首先将 26 个英文字母按任意顺序顺时针围成一个环,然后要传输的文本的每个字母都用这个环上的它的下一个字母替换。例如,假设 26 个英文字母排成的环为:qwertyuiopasdfghjklzxcvbnm,那么如果传输的文本为 manwhatcanisay,则加密后的文本为 qsmejsyvsmodsu。我们将这个环称为密钥。

假设你是这个国家敌国的间谍,你截获了对方的一段加密文本(设为 ),但是你不知道加密的密钥。你想要知道:将 通过某种密钥还原之后能得到的字典序最小的密文可能是什么?

紧接着是样例

3
qsmejsyvsmodsu
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxzy

输出

abcdebfgbchibj
bcdefghijklmnopqrstuvwxyza
bcdefghijklmnopqrstuvwxyaz

我的代码

#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;
}

我的输出

abcdebfgbchibj
badcfehgjilknmporqtsvuxwzy
badcfehgjilknmporqtsvuxwyz
2024/8/16 14:05
加载中...