CF 1117 E. Decypher the String

E. Decypher the String

链接

题意:

  有一个字符串,一些操作,每次操作交换两个位置的字符,经过这些操作后,会得到新的字符串。给你新的字符串,求原来的串。可以有3次询问,每次询问给出一个字符串,返回操作后的字符串。

分析:

  如果长度小于等于26,那么询问abc...xyz,就可以知道每个位置操作后的对应的位置。那么长度大于26的时候,考虑均分成26段,每段是一个字符,然后可以知道每段对应的位置集合。继续在每一段内均分即可,均分3次,即可到单个位置。

  代码实现很有意思,写成一个26进制数。

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
#include<bitset>
using namespace std;
typedef long long LL;

inline int read() {
    int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch==‘-‘)f=-1;
    for(;isdigit(ch);ch=getchar())x=x*10+ch-‘0‘;return x*f;
}

const int N = 10005;
char s[N], s1[N], s2[N], s3[N], ans[N];
bitset<N> a1[27], a2[27], a3[27], now;
int pos[N];

int main() {
    scanf("%s",s);
    int n = strlen(s);
    for (int i = 0; i< n; ++i) {
        int t = i;
        s1[i] = ‘a‘ + t % 26; t /= 26;
        s2[i] = ‘a‘ + t % 26; t /= 26;
        s3[i] = ‘a‘ + t % 26; t /= 26;
    }
    printf("? "); puts(s1); fflush(stdout); scanf("%s", s1);
    printf("? "); puts(s2); fflush(stdout); scanf("%s", s2);
    printf("? "); puts(s3); fflush(stdout); scanf("%s", s3);

    for (int i = 0; i < n; ++i) a1[s1[i] - ‘a‘].set(i);
    for (int i = 0; i < n; ++i) a2[s2[i] - ‘a‘].set(i);
    for (int i = 0; i < n; ++i) a3[s3[i] - ‘a‘].set(i);

    for (int i = 0; i < n; ++i) {
        int t = i;
        now = a1[t % 26]; t /= 26;
        now &= a2[t % 26]; t /= 26;
        now &= a3[t % 26]; t /= 26;
        for (int j = 0; j < n; ++j)
            if (now[j]) { pos[i] = j; break; }
    }
    for (int i = 0; i < n; ++i) ans[i] = s[pos[i]];
    printf("! %s\n", ans);
    return 0;
}

原文地址:https://www.cnblogs.com/mjtcn/p/10410254.html

时间: 2024-11-09 10:33:59

CF 1117 E. Decypher the String的相关文章

CF - 1117 F Crisp String

题目传送门 题解: 枚举非法对. 如果 ‘a'  和 ’b' 不能相邻的话,那么删除 'a' 'b'之间的字符就是非法操作了. 假设题目给定的字符串为 "acdbe",所以删除cd是非法操作, 因为cd是非法了,所以cde也是非法操作, 也就是说找到所有的非法操作之后往外推,比他多删的状态就一样是非法的了,当然对于上述的“acdbe"来说,不能确定 ”acd"是非法操作,因为在枚举非法对的时候,该非法对的字符并不能被删除. 然后把所有非法对的非法状态都存下来.然后从

cf 710 E Generate a String

题意: 开始你有数字$0$,你可以用代价$x$将该数字加$1$或减$1$(当$x > 0$时),或用代价$y$将该数字变为$2x$,那么问得到数字$n$所需的最少代价是多少. 数据范围$1 \leq x, y \leq 10^9$,$1 \leq n \leq 10^7$. 分析: 记得到数字$n$的代价为$f(n)$. 不加证明地给出如下结论: 注:可以通过观察数的二进制表达形式归纳证明下面的结论. 若$x = y$,则 $1^{\circ}$若$n$为偶数,则$f(n) = f(\frac{

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

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 st

xdoj

1000.a+b. #include<bits/stdc++.h> using namespace std; int a,b; int main() { ios::sync_with_stdio(false); while(cin >> a >> b) cout << a+b << endl; return 0; } 1001.直接开数组回爆内存,于是自己开个一维数组存放元素,大小需要自己斟酌.(或者动态数组) 直接处理对应位置,根据最后对应的位

省选前的做题记录(Round2)

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

Spark(十一) -- Mllib API编程 线性回归、KMeans、协同过滤演示

本文测试的Spark版本是1.3.1 在使用Spark的机器学习算法库之前,需要先了解Mllib中几个基础的概念和专门用于机器学习的数据类型 特征向量Vector: Vector的概念是和数学中的向量是一样的,通俗的看其实就是一个装着Double数据的数组 Vector分为两种,分别是密集型和稀疏型 创建方式如下: val array:Array[Double] = ... val vector = Vector.dense(array)//创建密集向量 val vector = Vector.

HBase MemStore与HStoreFile 的大小分析

Sumary: MemStore结构 KeyValue构成细节 HFile分析 Maven 项目例子使用了Maven来管理Dependency,要运行例子,需要有maven环境,后面提到的HFile,StoreFile,HStoreFile指的是同一样东西,也就是HBase中Region每个CF对应的数据文件.    HBase一直有一个问题,困扰着我一段时间了.时而思考一下,终不得解.    问题发生于5月某天,在做大量Put测试去观察MemStore的flush, HStoreFile的Sp

Curator入门教程1

 简介 Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情, 于是在它的基础上包装了一下, 提供了一套更好用的客户端框架. 1.zookekeeper基本功能      连接zookeeper,对节点进行crud.回调函数.判断节点是否存在 package bjsxt.curator.base; import java.util.List; imp