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;
}
posted @ 2026-10-17 19:08  SCX2014  阅读(1)  评论(0)    收藏  举报