zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    函数的调用惯例
    docker 强制删除镜像
    docker 安装 tomcat8
    阿里云 maven仓库地址配置
    ubuntu 18.04 安装搜狗输入法
    centos 监控进程,并自动重启
    intellj idea show "run dashboard" panel
    Centos7 服务器启动jar包
    maven centos7 环境变量
    linux关于IP,端口,防火墙相关命令
  • 原文地址:https://www.cnblogs.com/Creed-qwq/p/10421703.html
Copyright © 2011-2022 走看看