Educational Codeforces Round 60 E (數學思維)

題目鏈接

E. Decypher the String

題意:

一道交互題,系統生成了一個字符串 SS ( 2626 個小寫字母組成 len<=1e4len<=1e4),並且執行了若干次操作,每次操作交換兩個位置的字符,現在給你交換完的串,讓你詢問不超過 33 次得到原來的串,每次詢問可以輸入一個同樣長度由小寫字母組成的串,系統返回將該串經過同樣操作後的字符串。

思路:

考慮到 262626>1e426*26*26>1e4 所以我們將字符串長度分爲 2626 進制 就只有 33 位數,也就是說對於 i=x2626+y26+zi=x*26*26+y*26+z ,那麼我們對x,y,zx,y,z分別建立一個字符串,得到的字符串 s1,s2,s3s1,s2,s3 就對於交換後每一個位置的x1,y1,z1x1,y1,z1 通過和前面一樣的轉換就可以得到 i1=x12626+y126+z1i1=x1*26*26+y1*26+z1 ,就是變換後額位置,那麼就可以求出原串了。

代碼:

#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;

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章