#基数排序#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 ...
随机推荐
- CSDN的Markdown编辑器使用说明
这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...
- 6大数据类型之间的转换及数据在内存中的缓存机制----day03
1.自动类型转换 当2个不同类型的数据进行运算的时候,默认向更高精度转换 数据类型精度从低到高:bool < int < float <complex 1,1强制类型转换 # Nu ...
- centos7安装桌面-GNOME
CENTOS7安装桌面系统 GNOME桌面 # yum安装 # 更新已安装软件 yum upgrade -y # 安装额外yum源 yum install epel-release -y # 安装X ...
- ASP.NET 跨域配置
报错信息 The 'Access-Control-Allow-Origin' header is present on the requested resource 解决方案 web.config配置 ...
- 【LeetCode动态规划#03】整数拆分(数学题)
整数拆分 力扣题目链接(opens new window) 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 示例 1: 输入: 2 输出: 1 ...
- 浅谈errgroup的使用以及源码分析
本文讲解的是golang.org/x/sync这个包中的errgroup 1.errgroup 的基础介绍 学习过 Go 的朋友都知道 Go 实现并发编程是比较容易的事情,只需要使用go关键字就可以开 ...
- 【Azure Redis 缓存】Redis 连接失败
问题描述 Azure Redis 出现连接失败,过一会儿后,又能自动恢复. 问题解答 其实,因为Azure Redis服务一直都有升级维护的操作(平均每月一次),Redis服务更新是平台自动进行的计划 ...
- 【Azure Developer】使用MSAL4J 与 ADAL4J 的SDK时候,遇见了类型冲突问题 "java.util.Collections$SingletonList cannot be cast to java.lang.String"
问题描述 在博文 "[Azure Developer]使用 Powershell az account get-access-token 命令获取Access Token (使用用户名+密码 ...
- NET项目&DLL反编译&MSSQL监控&VS搜索&注入&上传
知识点 1.NET普通源码&编译源码 2.DLL反编译&后缀文件&指向 3.代码审计-SQL注入&文件上传 ASPX文件 -> CS ASPX.CS DLL反编译 ...
- Windows配置R语言、RStudio开发环境
本文介绍R语言及其集成开发环境RStudio的下载.安装方法. R语言是一个属于GNU操作系统的开源软件,在数据统计与分析.可视化等方面具有优秀的表现:而RStudio则是R语言的集成开发环境 ...