CF1117E Decypher the String

如果我们能询问一个排列的话,我们就可以得到这个置换,然后反向求解。
但现在字符集只有26。
考虑26^3>1e5。
用一个三维坐标去映射到一个一维整数,然后就可以构造排列了。

#include<bits/stdc++.h>
#define N 1100000
#define eps 1e-7
#define inf 1e9+7
#define db double
#define ll long long
#define ldb long double
using namespace std;
inline int read()
{
	char ch=0;
	int x=0,flag=1;
	while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;}
	while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
	return x*flag;
}
char s[N],s1[N],s2[N],s3[N],t1[N],t2[N],t3[N],ans[N];
int main()
{
	scanf("%s",s+1);int n=strlen(s+1),cnt=0;
	for(int i=0;i<26;i++)for(int j=0;j<26;j++)for(int k=0;k<26;k++)
	if(cnt!=n)s1[++cnt]=i+'a',s2[cnt]=j+'a',s3[cnt]=k+'a';
	printf("? ");for(int i=1;i<=n;i++)printf("%c",s1[i]);printf("\n");fflush(stdout);
	fflush(stdin);scanf("%s",t1+1);
	printf("? ");for(int i=1;i<=n;i++)printf("%c",s2[i]);printf("\n");fflush(stdout);
	fflush(stdin);scanf("%s",t2+1);
	printf("? ");for(int i=1;i<=n;i++)printf("%c",s3[i]);printf("\n");fflush(stdout);
	fflush(stdin);scanf("%s",t3+1);
	for(int i=1;i<=n;i++)ans[(t1[i]-'a')*26*26+(t2[i]-'a')*26+(t3[i]-'a')+1	]=s[i];
	printf("! ");for(int i=1;i<=n;i++)printf("%c",ans[i]);printf("\n");fflush(stdout);
	return 0;
}
posted @ 2019-02-23 09:53  Creed-qwq  阅读(170)  评论(0编辑  收藏  举报