#基数排序#CF1654F Minimal String Xoration
分析
有没有一种办法可以将每个 \(j\) 的比较过程同时进行,
可以发现其实这个过程很像后缀排序,实际上只是加号变成了异或,
从低位到高位重新将字符串排名,用同样的方法做到 \(O(2^nn)\)
代码
#include <iostream>
using namespace std;
const int N=300011; string S;
int n,two[N],rk[N],tp[N],Rk[N],M,c[N];
int main(){
ios::sync_with_stdio(0);
cin>>n>>S,two[0]=1;
for (int i=1;i<=n;++i) two[i]=two[i-1]<<1;
for (int i=0;i<two[n];++i) rk[i]=i,tp[i]=S[i]-96;
M=26;
for (int i=1;i<=n;++i){
for (int j=0;j<=M;++j) c[j]=0;
for (int j=0;j<two[n];++j) ++c[tp[rk[j]^two[i-1]]];
for (int j=1;j<=M;++j) c[j]+=c[j-1];
for (int j=two[n]-1;~j;--j) Rk[--c[tp[rk[j]^two[i-1]]]]=rk[j];
for (int j=0;j<=M;++j) c[j]=0;
for (int j=0;j<two[n];++j) ++c[tp[Rk[j]]];
for (int j=1;j<=M;++j) c[j]+=c[j-1];
for (int j=two[n]-1;~j;--j) rk[--c[tp[Rk[j]]]]=Rk[j];
for (int j=0;j<=M;++j) c[j]=0;
Rk[rk[0]]=0;
for (int j=1;j<two[n];++j)
Rk[rk[j]]=Rk[rk[j-1]]+(tp[rk[j]]!=tp[rk[j-1]]||tp[rk[j]^two[i-1]]!=tp[rk[j-1]^two[i-1]]);
for (int j=0;j<two[n];++j) tp[j]=Rk[j];
M=Rk[rk[two[n]-1]];
}
for (int i=0;i<two[n];++i) cout<<S[rk[0]^i];
return 0;
}
#基数排序#CF1654F Minimal String Xoration的更多相关文章
- Codeforces 797C - Minimal string
C. Minimal string 题目链接:http://codeforces.com/problemset/problem/797/C time limit per test 1 second m ...
- Minimal string CodeForces - 797C
Minimal string CodeForces - 797C 题意:有一个字符串s和空串t和u,每次操作可以将s的第一个字符取出并删除然后放到t的最后,或者将t的最后一个字符取出并删除然后放到u的 ...
- CodeForce-797C Minimal string(贪心模拟)
Minimal string CodeForces - 797C Petya 收到一个长度不超过 105 的字符串 s.他拿了两个额外的空字符串 t 和 u 并决定玩一个游戏.这个游戏有两种合法操作: ...
- Minimal string 栈 贪心
time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...
- CodeForces 797C Minimal string:贪心+模拟
题目链接:http://codeforces.com/problemset/problem/797/C 题意: 给你一个非空字符串s,空字符串t和u.有两种操作:(1)把s的首字符取出并添加到t的末尾 ...
- Minimal string CodeForces – 797C
题目链接 题目难度: 1700rating 题目类型:string+贪心+STL 题目思路: 由于题目要求的最终结果是字典序最小的那个字符串,那么我们从贪心的从’a’开始查找字符串里是否存在,如果存在 ...
- [cf797c]Minimal string(贪心+模拟)
题意: 给出了字符串s的内容,字符串t,u初始默认为空,允许做两种操作: 1.把s字符串第一个字符转移到t字符串最后 2.把t字符串最后一个字符转移到u字符串最后 最后要求s.t字符串都为空,问u字符 ...
- 【codeforces 797C】Minimal string
[题目链接]:http://codeforces.com/contest/797/problem/C [题意] 一开始,给你一个字符串s:两个空字符串t和u; 你有两种合法操作; 1.将s的开头字符加 ...
- 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 ...
- Codeforces828 C. String Reconstruction
C. String Reconstruction time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
随机推荐
- C++ 多线程的错误和如何避免(6)
加锁的临界区要尽可能的紧凑和小型 问题分析: 当一个线程在临界区内执行时,所有其他试图进入临界区的线程都会被阻止,所以我们应该保证临界区尽可能的小.比如, void CallHome(string m ...
- C++ 线程的学习---线程同步
因为是学习篇,写下是为了个人的学习与理解.故参考其他文章为多. 为什么需要线程同步? 在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作.更多的情况是一些线程进行某些处理操作,而 ...
- 产品分享:Qt鸿图电子智慧白板(适合会议机、电子黑板、电子笔记、电子阅读器等场景),当前版本v1.0.0
产品 鸿途电子智慧白板. 原理 使用Qt技术为基础,开发的windows/ubuntu/arm电子绘图板,主要为windows,支持触摸鼠标,可以定制跨平台. 适合场景 1.会议机 ...
- day01---操作系统安装环境准备
虚拟机安装操作系统步骤 1.新建虚拟主机 2.选择自定义 3.稍后安装操作系统 4.操作系统选择linux 5.选择存放位置 6.cpu和核数选择,默认即可 7.内存分配 8.网络选择 9.控制器类型 ...
- TensorFlow 回归模型
TensorFlow 回归模型 首先,导入所需的库和模块.代码中使用了numpy进行数值计算,matplotlib进行数据可视化,tensorflow进行机器学习模型的构建和训练,sklearn进行多 ...
- STL-list模拟实现
#pragma once #include"16my_Itetator.h" //测试用 #include<iostream> //测试用 using std::cou ...
- TCP的链接和断开_wireShark实践
目录 准备 TCP连接的三次握手 WireShark验证 TCP的四次挥手 WireShark验证 状态解释 其他的 # 概述 终于到了学习总结时间了 准备 TCP连接的三次握手 转自https:/ ...
- 【5分钟】W10 64bit系统本地安装postgresql 11
1.下载 官网下载地址 2.安装 一路默认,有一个选语言的可以选中chinese simple(中文简体). 3.初始化 1)进入bin: cd C:\Program Files\PostgreS ...
- JS案例-网页轮播图
鼠标经过轮播图模块,左右按钮提示,离开隐藏左右按钮 点击右侧按钮一次,图片往左播放一张,以此类推,左侧按钮同理 图片播放的同时,下面小圆圈模块跟随一起变化 点击小圆圈,可以播放相应图片 鼠标不经过轮播 ...
- 摆脱鼠标系列 - vscode 搜索 自定义快捷键 F1 - 然后F4 搜索 Alt+Shift+回车 跳转到搜索列表 选好后回车进入文件
摆脱鼠标系列 - vscode 搜索 自定义快捷键 F1 搜索 Alt+Shift+回车 跳转到搜索列表 选好后回车进入文件 F1的设置可能在其他贴子了 最新特大好消息 F4 是搜索完的跳转 等于F1 ...