题解 CF1117E【Decypher the String】
本来都
题意是现在有一个长度
你有三次交互机会,每次给一个长度与原串相等的字符串,返回经过
现在给你
我们考虑一下,
发现
就考虑如何一次交互如何扩大
我们可以通过以下方式
第一次:
我们称
第二次:
我们称
第三次:
这样,对于一个位置i,第一次我们可以知道
当然还有另外一种方法,第一次使用26个字母循环,第二次使用25个,第三次23个,这样就可以知道
不过
所以,如果
代码我只写了第一种方法的:
#include <bits/stdc++.h>
using namespace std;
const int Maxn=10005;
int bel[Maxn],n;
string str,res,print;
char ans[Maxn];
int main()
{
cin>>res;
int siz=res.size();
print="? ";
char ch='a';
for(int i=0;i<siz;i++)
{
print+=ch;
if((i+1)%(26*26)==0) ch++;
}
cout<<print<<endl;
cin>>str;
for(int i=0;i<siz;i++)
bel[i]+=(str[i]-'a')*26*26;
ch='a';
print="? ";
for(int i=0;i<siz;i++)
{
print+=ch;
if((i+1)%26==0) ch++;
if(ch=='z'+1) ch='a';
}
cout<<print<<endl;
cin>>str;
for(int i=0;i<siz;i++)
bel[i]+=(str[i]-'a')*26;
ch='a';
print="? ";
for(int i=0;i<siz;i++)
{
print+=ch;
ch++;
if(ch=='z'+1) ch='a';
}
cout<<print<<endl;
cin>>str;
for(int i=0;i<siz;i++)
bel[i]+=str[i]-'a';
for(int i=0;i<siz;i++)
ans[bel[i]]=res[i];
printf("! %s",ans);
fflush(stdout);
return 0;
}