正题

题目链接:https://www.luogu.com.cn/problem/CF1654F


题目大意

给出一个长度为2n2^n2n的字符串sss(下标为0∼2n−10\sim 2^n-10∼2n−1)

你要找到一个xxx满足ti=sixorxt_{i}=s_{i\ xor\ x}ti​=si xor x​,并且ttt的字典序最小。

1≤n≤181\leq n\leq 181≤n≤18


解题思路

考虑设f(i,x)f(i,x)f(i,x)表示选的值为xxx时,最终的ttt的前2i2^i2i个字符。

那么我们有
f(i,x)=f(i−1,x)+f(i−1,xxor2i−1)f(i,x)=f(i-1,x)+f(i-1,x\ xor\ 2^{i-1})f(i,x)=f(i−1,x)+f(i−1,x xor 2i−1)
(就是和另一边拼起来)

发现这个部分和SASASA的有点像,我们考虑倍增来做,枚举这个iii。

假设我们已经得到所有f(i−1,x)f(i-1,x)f(i−1,x)的排名,那么当我们比较f(i,x)f(i,x)f(i,x)和f(i,y)f(i,y)f(i,y)时,优先比较f(i−1,x)f(i-1,x)f(i−1,x)和f(i−1,y)f(i-1,y)f(i−1,y),如果相等那么比较f(i−1,xxor2i−1)f(i-1,x\ xor\ 2^{i-1})f(i−1,x xor 2i−1)和f(i−1,yxor2i−1)f(i-1,y\ xor\ 2^{i-1})f(i−1,y xor 2i−1)即可。

然后我们又可以O(1)O(1)O(1)比较然后O(2nn)O(2^nn)O(2nn)得出新的iii的所有f(i,x)f(i,x)f(i,x)的排名。

时间复杂度:O(2nn2)O(2^nn^2)O(2nn2)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1<<18;
int n,m,r,p[N],a[N],b[N];
char s[N];
bool cmp(int x,int y){if(a[x]==a[y])return a[x^r]<a[y^r];return a[x]<a[y];
}
int main()
{scanf("%d",&n);m=(1<<n); scanf("%s",s);for(int i=0;i<m;i++)p[i]=i;for(int i=0;i<m;i++)a[i]=s[i]-'a';sort(p,p+m,cmp);for(int i=0;i<n;i++){r=1<<i;sort(p,p+m,cmp);b[p[0]]=1;for(int j=1;j<m;j++)b[p[j]]=b[p[j-1]]+cmp(p[j-1],p[j]);for(int j=0;j<m;j++)a[j]=b[j];}for(int i=0;i<m;i++)printf("%c",s[i^p[0]]);return 0;
}

CF1654F-Minimal String Xoration【倍增】相关推荐

  1. Codeforces 1175E Minimal Segment Cover 倍增

    Minimal Segment Cover 嗯嗯嗯.. 打倍增的时候两个for写反了查了半天bug... 我们先把没用的线段去掉, 然后对每个线段都找到和它接触的r最大的作为下一个, 然后打倍增就好了 ...

  2. 797C C. Minimal string

    贪心,后缀 思路: 逆序维护一个数组minn[i]=x,表示第i个位子后边最小的字符是x. 那么对应维护一个栈,如果此时栈顶字符小于等于minn[此时要加入的元素的位子],那么就出栈,将栈顶这个字符输 ...

  3. CodeForces 797C Minimal string

    栈. 先处理一下后缀最小值. 对于每一个字符,如果不是后缀最小值,将栈顶小于当前后缀最小值的都弹出,然后压入当前字符. 如果是后缀最小值,将栈顶小于当前后缀最小值的都弹出,再输出该字符. #inclu ...

  4. Codeforces 797C Minimal string【贪心】

    题意: 给出了字符串s的内容,字符串t,u初始默认为空,允许做两种操作: 1.把s字符串第一个字符转移到t字符串最后. 2.把t字符串最后一个字符转移到u字符串最后. 最后要求s.t字符串都为空,问u ...

  5. [cf797c]Minimal string(贪心+模拟)

    题意: 给出了字符串s的内容,字符串t,u初始默认为空,允许做两种操作: 1.把s字符串第一个字符转移到t字符串最后 2.把t字符串最后一个字符转移到u字符串最后 最后要求s.t字符串都为空,问u字符 ...

  6. Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C. String Reconstruction 并查集

    C. String Reconstruction 题目连接: http://codeforces.com/contest/828/problem/C Description Ivan had stri ...

  7. 【CodeForces - 827A】String Reconstruction(并查集合并区间,思维)

    题干: Ivan had string s consisting of small English letters. However, his friend Julia decided to make ...

  8. Codeforces 题目合集+分类+代码 【Updating...】【361 in total】

    961A - Tetris                                                模拟                                      ...

  9. IDA Pro 搜索中文字符串

    IDA Pro 搜索中文字符串 IDA 的字符串窗口默认只能显示英文,网上的一些方法是指定启动时的参数可以显示中文 ida64 -DCULTURE=all ida -DCULTURE=all 还有就是 ...

最新文章

  1. Linux下修改python pip镜像源:推荐豆瓣源
  2. JVM运行时数据区分析
  3. 【剑指offer】面试题10- I:斐波那契数列(Java)
  4. 表单提交数据大小的限制
  5. Java学习笔记1.1.2 搭建Java开发环境 - 安装配置JDK
  6. java 堆_Java 对象都是在堆上分配内存吗?
  7. 一起谈.NET技术,C#中的lock关键字
  8. 简易交通信号灯c语言程序,基于Protues仿真的简单交通信号灯附C语言程序
  9. 基于Python的信用评分卡模型分析(强烈推荐)
  10. 论文分享|高精度面结构光三维测量方法研究
  11. 宿舍的呼噜神,快看过来,我这里有药!!!
  12. 不一样的xss payload
  13. Git 工具(写的很乱)
  14. 从诺贝尔奖到“吃鸡守护者”:通往极点的手机散热战争
  15. 《Microsoft Sql server 2008 Internals》读书笔记--第六章Indexes:Internals and Management(3)
  16. EOF需要在行首结束
  17. matlab 点球 蒙特罗,中超-蒙特罗梅开二度迪亚涅点球 保级大战泰达4-0亚泰
  18. STM32F1与STM32CubeIDE编程实例-振动传感器驱动
  19. springboot2 配置404、403、500等错误页面自动跳转
  20. 【Python】什么是python对象

热门文章

  1. nashorn js 调用 java_从nashorn(JDK 8 JavaScript引擎)调用char []输入参数调用Java函数?...
  2. 件工程项目开发最全文档模板_一文带你了解微信小程序社区和小程序开发
  3. 修改正文中参考文献标注_论文写作中怎样正确插入参考文献,引用文献如何标注?...
  4. mongodb时间范围查询少8个小时_为何要对开源mongodb数据库内核做二次开发
  5. 孕妇可以在计算机教室待吗,电脑对孕妇有辐射吗?孕妇使用电脑的注意事项
  6. 计算机组成与结构PLA,计算机组成与结构.doc
  7. 服务器机房 维护,服务器机房建设与管理维护.pdf
  8. mysql 固定符号分列显示_MySql中指定符号分割并分行展示
  9. 小型数字系统---运动码表设计
  10. UVA - 548 Tree