题目链接
E. Decypher the String
题意:
一道交互题,系统生成了一个字符串 ( 个小写字母组成 ),并且执行了若干次操作,每次操作交换两个位置的字符,现在给你交换完的串,让你询问不超过 次得到原来的串,每次询问可以输入一个同样长度由小写字母组成的串,系统返回将该串经过同样操作后的字符串。
思路:
考虑到 所以我们将字符串长度分为 进制 就只有 位数,也就是说对于 ,那么我们对 分别建立一个字符串,得到的字符串 就对于交换后每一个位置的 通过和前面一样的转换就可以得到 ,就是变换后额位置,那么就可以求出原串了。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+10;
string query(string x){
string temp;
cout<<"? "<<x<<endl;
fflush(stdout);
cin>>temp;
return temp;
}
int pos[N],ans[N];
string s1[3],s2[3],s;
int main()
{
int n;
cin>>s;n=s.length();
for(int i=0;i<n;i++){
s1[2]+=char(i/(26*26)%26+'a');
s1[1]+=char((i/26)%26+'a');
s1[0]+=char(i%26+'a');
}
for(int i=0;i<3;i++){
s2[i]=query(s1[i]);
}
for(int i=0;i<n;i++){
pos[i]=((s2[2][i]-'a')*26*26)+((s2[1][i]-'a')*26)+(s2[0][i]-'a');
}
cout<<"! ";
for(int i=0;i<n;i++)ans[pos[i]]=i;
for(int i=0;i<n;i++)cout<<s[ans[i]];
cout<<endl;
}