題目鏈接
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;
}