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

原文地址:https://www.cnblogs.com/Creed-qwq/p/10421703.html

时间: 2024-10-30 03:34:32

CF1117E Decypher the String的相关文章

CF 1117 E. Decypher the String

E. Decypher the String 链接 题意: 有一个字符串,一些操作,每次操作交换两个位置的字符,经过这些操作后,会得到新的字符串.给你新的字符串,求原来的串.可以有3次询问,每次询问给出一个字符串,返回操作后的字符串. 分析: 如果长度小于等于26,那么询问abc...xyz,就可以知道每个位置操作后的对应的位置.那么长度大于26的时候,考虑均分成26段,每段是一个字符,然后可以知道每段对应的位置集合.继续在每一段内均分即可,均分3次,即可到单个位置. 代码实现很有意思,写成一个

Educational Codeforces Round 60 (Rated for Div. 2) E. Decypher the String

题目大意:这是一道交互题.给你一个长度为n的字符串,这个字符串是经过规则变换的,题目不告诉你变换规则,但是允许你提问3次:每次提问你给出一个长度为n的字符串,程序会返回按变换规则变换后的字符串,提问3次后你需要猜出这个字符串.解法是学习https://blog.csdn.net/baiyifeifei/article/details/87807822 这个博主的,借用了进制的思想非常巧妙. 解法:对于某个位置的来源位置我们设为x,因为26*26*26>10000,那么x可以唯一表示为x=a*26

省选前的做题记录(Round2)

[CF1109B] Sasha and One More Name 先把无解情况aaabaaa.aaaaaa判掉,然后我们可以证明答案不会超过2. 对于一个回文串,两个指针从两端向内移动直到字符发生变化,在这里看一刀然后交换左右两端即为一种合法方案. 所以我们只需要判断答案是否能为\(1\),暴力判即可. [CF1109C] Sasha and a Patient Friend 假设我们有一个序列数据结构,那么先考虑每个结点需要维护哪些值才能支持合并左右儿子. 维护: 当前点时刻\(time\)

Codeforces Edu Round 60 A-E

A. Best Subsegment 显然,选择数列中的最大值当做区间(长度为\(1\)).只要尝试最大值这个区间是否能扩展(左右两边值是否跟它一样就行了) #include <cstdio> #include <iostream> #include <cmath> using namespace std; const int N = 100010; int n, a[N], val = -1, res = -1; int main(){ scanf("%d&

C# 引用类型之特例string

在C#编程的时候经常会使用字符串(string)类型,它也是引用类型,但是处处都不作为引用的用法来使用,实属特例,下来我一一罗列出来,供自己记忆方便: 1)字符串的直接赋值:本身字符串就是引用类型,应该使用  new 对象方法一个实例,但是微软为了方便大家,可以直接定义字符串变量 并且赋值操作,例如: string a = "我的中国心"; ,这样只是简化我们的操作: 2)一个字符串赋值给另一个字符串变量:正常的引用类型会将两个引用变量指向同一个地址,但是一个字符串变量赋值给另一个字符

C++ String 及其与char[]的比较

在学习C++之前  一般都是学过了C语言了 在C语言中   我们对字符串进行保存操作  使用的是char[] 但是在C++中    string比char[]的使用更为频繁  常见    下面稍微讲一下我对于string的认知 1.与其他的标准库类型一样   用户程序需要使用String类型对象  就必须包含相关的头文件   (为了编写方便   需要提供合适的using声明) #include <string> using std::string; 2.string对象的定义与初始化 stri

java String 类 基础笔记

字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String s = "abc";//存放于字符串常量池,产生1个对象 String s1=new String("abc");//堆内存中new创建了一个String对象,产生2个对象 String类中的equals比较字符串中的内容. 常用方法: 一:获取 1.获取字符串中字符的个数(长度):length();方法. 2.根据位置获取字符:charAt(int index); 3.根据字符获取在字符串中

The constructor ClassPathXmlApplicationContext(String) refers to the missing type BeansException

"The constructor ClassPathXmlApplicationContext(String) refers to the missing type BeansException" "构造函数ClassPathXmlApplicationContext(字符串)是指缺失类型BeansException" 出现错误的原因:jar没有正确引入,即使表面上你能import包. import org.junit.Test; import org.spring

float类型如何转换为string类型

在一些很大的float类型的地方会用科学记数法表示,这个时候如果想完整记录下来,还是得转字符串,这里书写一个float类型转string类型的方法 <?php function float_to_string($float=0) { if(stripos($float, "e")!==false) { $tmp = explode("e",strtolower($float)); $float=bcmul($tmp[0], bcpow(10, $tmp[1])