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

猜你喜欢

转载自www.cnblogs.com/Creed-qwq/p/10421703.html