P16620 [GKS 2017 #C] Ambiguous Cipher 题解
题目大意
设每个字符配的数字为 \(P[ch]\)。
给你一个字符串 \(W\),要你求出一个字符串 \(y\),使得 \(P_{W_i}\) 等于 \((P_{y_{i-1}}+P_{y_{i+1}})\bmod26\)。
算法分析
我们知道 \(P_{W_1}\) 等于 \(P_{y_2}\),那么反之亦然。
我们还知道 \(P_{W_3}\) 等于 \((P_{y_2}+P_{y_4})\bmod26\),这样,我们就可以求出 \(P_{y_4}\) 了,按这样我们可以继续往后求。
依照这样,从后往前推也是可以的。
这时就可以判断能否解出唯一解,如果 \(W\) 的长度是奇数,就说明有多解,否则直接推就行了。
#include<bits/stdc++.h>
using namespace std;
const int N=55;
int a[N];
int main(){
std::ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int T,id=0;
cin>>T;
while(T--){
string s;
cin>>s;
int n=s.size();
s=" "+s;
cout<<"Case #"<<++id<<": ";
if(n%2==1){//如果有多解
cout<<"AMBIGUOUS\n";
continue;
}
a[2]=s[1]-'A';
for(int i=4;i<=n;i+=2){//从前往后推
a[i]=(s[i-1]-'A'-a[i-2]+26)%26;
}
a[n-1]=s[n]-'A';
for(int i=n-3;i>=1;i-=2){//从后往前推
a[i]=(s[i+1]-'A'-a[i+2]+26)%26;
}
for(int i=1;i<=n;i++){
cout<<char(a[i]+'A');
}
cout<<'\n';
}
return 0;
}

浙公网安备 33010602011771号