• 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("
    ");fflush(stdout);
    	fflush(stdin);scanf("%s",t1+1);
    	printf("? ");for(int i=1;i<=n;i++)printf("%c",s2[i]);printf("
    ");fflush(stdout);
    	fflush(stdin);scanf("%s",t2+1);
    	printf("? ");for(int i=1;i<=n;i++)printf("%c",s3[i]);printf("
    ");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("
    ");fflush(stdout);
    	return 0;
    }
    
  • 相关阅读:
    sort()的部分用法
    蓝桥杯 算法训练 审美课
    蓝桥杯 基础练习 查找整数
    2018年第九届蓝桥杯【C++省赛B组】【第二题:明码】
    蓝桥杯 特殊回文数
    比较两文本程序
    蓝桥杯 基础练习 十六进制转八进制
    Python | 用Pyinstaller打包发布exe应用
    SpringBoot-04-整合JDBC
    SpringBoot-03-自定义Starter
  • 原文地址:https://www.cnblogs.com/Creed-qwq/p/10421703.html
Copyright © 2020-2023  润新知