CF1654F-Minimal String Xoration【倍增】
正题
题目链接: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【倍增】相关推荐
- Codeforces 1175E Minimal Segment Cover 倍增
Minimal Segment Cover 嗯嗯嗯.. 打倍增的时候两个for写反了查了半天bug... 我们先把没用的线段去掉, 然后对每个线段都找到和它接触的r最大的作为下一个, 然后打倍增就好了 ...
- 797C C. Minimal string
贪心,后缀 思路: 逆序维护一个数组minn[i]=x,表示第i个位子后边最小的字符是x. 那么对应维护一个栈,如果此时栈顶字符小于等于minn[此时要加入的元素的位子],那么就出栈,将栈顶这个字符输 ...
- CodeForces 797C Minimal string
栈. 先处理一下后缀最小值. 对于每一个字符,如果不是后缀最小值,将栈顶小于当前后缀最小值的都弹出,然后压入当前字符. 如果是后缀最小值,将栈顶小于当前后缀最小值的都弹出,再输出该字符. #inclu ...
- Codeforces 797C Minimal string【贪心】
题意: 给出了字符串s的内容,字符串t,u初始默认为空,允许做两种操作: 1.把s字符串第一个字符转移到t字符串最后. 2.把t字符串最后一个字符转移到u字符串最后. 最后要求s.t字符串都为空,问u ...
- [cf797c]Minimal string(贪心+模拟)
题意: 给出了字符串s的内容,字符串t,u初始默认为空,允许做两种操作: 1.把s字符串第一个字符转移到t字符串最后 2.把t字符串最后一个字符转移到u字符串最后 最后要求s.t字符串都为空,问u字符 ...
- 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 ...
- 【CodeForces - 827A】String Reconstruction(并查集合并区间,思维)
题干: Ivan had string s consisting of small English letters. However, his friend Julia decided to make ...
- Codeforces 题目合集+分类+代码 【Updating...】【361 in total】
961A - Tetris 模拟 ...
- IDA Pro 搜索中文字符串
IDA Pro 搜索中文字符串 IDA 的字符串窗口默认只能显示英文,网上的一些方法是指定启动时的参数可以显示中文 ida64 -DCULTURE=all ida -DCULTURE=all 还有就是 ...
最新文章
- Linux下修改python pip镜像源:推荐豆瓣源
- JVM运行时数据区分析
- 【剑指offer】面试题10- I:斐波那契数列(Java)
- 表单提交数据大小的限制
- Java学习笔记1.1.2 搭建Java开发环境 - 安装配置JDK
- java 堆_Java 对象都是在堆上分配内存吗?
- 一起谈.NET技术,C#中的lock关键字
- 简易交通信号灯c语言程序,基于Protues仿真的简单交通信号灯附C语言程序
- 基于Python的信用评分卡模型分析(强烈推荐)
- 论文分享|高精度面结构光三维测量方法研究
- 宿舍的呼噜神,快看过来,我这里有药!!!
- 不一样的xss payload
- Git 工具(写的很乱)
- 从诺贝尔奖到“吃鸡守护者”:通往极点的手机散热战争
- 《Microsoft Sql server 2008 Internals》读书笔记--第六章Indexes:Internals and Management(3)
- EOF需要在行首结束
- matlab 点球 蒙特罗,中超-蒙特罗梅开二度迪亚涅点球 保级大战泰达4-0亚泰
- STM32F1与STM32CubeIDE编程实例-振动传感器驱动
- springboot2 配置404、403、500等错误页面自动跳转
- 【Python】什么是python对象
热门文章
- nashorn js 调用 java_从nashorn(JDK 8 JavaScript引擎)调用char []输入参数调用Java函数?...
- 件工程项目开发最全文档模板_一文带你了解微信小程序社区和小程序开发
- 修改正文中参考文献标注_论文写作中怎样正确插入参考文献,引用文献如何标注?...
- mongodb时间范围查询少8个小时_为何要对开源mongodb数据库内核做二次开发
- 孕妇可以在计算机教室待吗,电脑对孕妇有辐射吗?孕妇使用电脑的注意事项
- 计算机组成与结构PLA,计算机组成与结构.doc
- 服务器机房 维护,服务器机房建设与管理维护.pdf
- mysql 固定符号分列显示_MySql中指定符号分割并分行展示
- 小型数字系统---运动码表设计
- UVA - 548 Tree