E. Decypher the String
题意:
串都是由小写字母组成。已知一个结果串(长度不超过1e4),该串是由原始串经过若干次交换次得到,你至多可以询问3次,每次输入原始串,它经过相同交换后返回给你结果串。
最后回答原始串是什么。
题解:
首先分析当长度小于等于 26 26 26时,很容易一次就可以得到 p p p数组, p i p_i pi表示结果串 i i i位置对应原始串 p i p_i pi位置。当时当串长度大于 26 26 26时,可以以 2 6 2 , 2 6 3 26^2,26^3 262,263为一个循环节来搞,这样就转化为了一个 26 26 26进制问题。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+9;
int n;
string s,t;
int p[N];
int main(){
cin>>s;n=s.size();
string t1,t2,t3;
for(int i=0;i<n;i++){
t1+=('a'+i%26);
t2+=('a'+i/26%26);
t3+=('a'+i/26/26%26);
}
cout<<"? "<<t1<<endl;fflush(stdout);cin>>t1;
cout<<"? "<<t2<<endl;fflush(stdout);cin>>t2;
cout<<"? "<<t3<<endl;fflush(stdout);cin>>t3;
for(int i=0;i<n;i++)p[i]=(t1[i]-'a'+(t2[i]-'a')*26+(t3[i]-'a')*26*26);
t.resize(n);
for(int i=0;i<n;i++)t[p[i]]=s[i];
cout<<"! "<<t<<endl;
return 0;
}