bzoj 4104 解密运算 —— 思路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4104
一开始发现了给出的顺序是按这些末尾字符后面的后缀排序得到的;
然后发现可以一个一个把字符串补全;
因为首先知道所有单个字符,排序后就是那些串的第一位,和末尾连起来,得到 n+1 个二元组;
然后把这 n+1 个二元组排序,再和末尾连起来,得到 n+1 个三元组;
以此类推,最后可以得到整个串,可惜这样做是 n^2 的,空间也是;
考虑倍增?因为这样得到的四元组的前两个位置其实和当初得到的二元组一样...
而且这个过程和后缀数组的排序也很像啊!二元组是第二关键字,再加一个二元组是第一关键字...
然后想了一晚上也没想明白怎么倍增;
实际上,我又忘了后缀排序的另一种方法——(首字符相同的)去掉首字符,看后面后缀的排序;
这道题——给出的末尾字符是首字符的话,那么它们已经按去掉首字符的后缀后排好序了;
所以把每行的字符以字符大小为第一关键字,行数为第二关键字排序,就知道在原串中这些首字符对应的后缀的排名了;
而这些行也是按字典序排序的;
所以知道了每一行末尾字符是哪一行的开头;
于是从 “.” 开始,按排名对应回每一行,就倒着得到了原串!
在我原来的想法中,问题在于相同的字符作为开头,无法知道谁对应哪个末尾;
而如果利用行的排名,相同字符之间的排名也明确了,就不需要每次再排序来确定对应的末尾字符;
后缀排序的那个方法(去掉首字符)...真常用啊...
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const xn=2e5+;
int n,m,rk[xn],s[xn],ans[xn];
struct N{int s,id;}p[xn];
bool cmp(N x,N y){return x.s<y.s||(x.s==y.s&&x.id<y.id);}
bool cmp2(N x,N y){return x.id<y.id;}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n+;i++)
scanf("%d",&s[i]),p[i].s=s[i],p[i].id=i;
sort(p+,p+n+,cmp);
for(int i=;i<=n+;i++)rk[p[i].id]=i;
int top=,nw=p[].id;
while(top<n+)ans[++top]=s[nw],nw=rk[nw];
while(top>)printf("%d ",ans[top--]); puts("");
return ;
}
bzoj 4104 解密运算 —— 思路的更多相关文章
- bzoj 4104 [Thu Summer Camp 2015]解密运算——思路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4104 想了很久,想出一个 nlogn (也许是 n2logn )的,可惜空间是 n2 . 已 ...
- 【BZOJ 4104】 4104: [Thu Summer Camp 2015]解密运算 (智商)
4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 370 Solved: 237 De ...
- [Thu Summer Camp 2015]解密运算
4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec Memory Limit: 512 MB Description 对于一个长度为N的字符串,我 ...
- 【BZOJ4104】解密运算 [暴力]
解密运算 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 对于一个长度为N的字符串,我们在字 ...
- 【BZOJ 4104】【Thu Summer Camp 2015】解密运算
http://www.lydsy.com/JudgeOnline/problem.php?id=4104 网上题解满天飞,我也懒得写了 #include<cstdio> #include& ...
- 【BZOJ 4104】【THUSC 2015】解密运算
http://www.lydsy.com/JudgeOnline/problem.php?id=4104 网上题解满天飞,我也懒得写了 #include<cstdio> #include& ...
- LeetCode - 136. Single Number - ( C++ ) - 解题报告 - 位运算思路 xor
1.题目大意 Given an array of integers, every element appears twice except for one. Find that single one. ...
- xml文件加密上传和sftp下载解密基本思路
AES对称加密效率高,对大文件加密适合.RSA非对称加密效率低,更安全,对小文件加密适合. 整理 11:12 2016/8/4 加密:1.xml xml.md5摘要 2.(xml)aes加密 (xml ...
- BZOJ4104:[Thu Summer Camp 2015]解密运算——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4104 对于一个长度为N的字符串,我们在字符串的末尾添加一个特殊的字符".".之 ...
随机推荐
- Cocoapods完整使用篇
温馨提示:在篇文章中所使用的Xcode版本为Xcode7. 一.什么是CocoaPods? 简单来说,就是专门为iOS工程提供对第三方库的依赖的管理工具,通过CocoaPods,我们可以单独管理每 ...
- Linux kernel manpages
https://www.linuxquestions.org/questions/linux-newbie-8/man-pages-for-kernel-functions-758389/ 在Linu ...
- A、B两伙马贼意外地在一片沙漠中发现了一处金矿,双方都想独占金矿,但各自的实力都不足以吞下对方,经过谈判后,双方同意用一个公平的方式来处理这片金矿。处理的规则如下:他们把整个金矿分成n段,由A、B开始轮流从最左端或最右端占据一段,直到分完为止。 马贼A想提前知道他们能分到多少金子,因此请你帮忙计算他们最后各自拥有多少金子?(两伙马贼均会采取对己方有利的策略)
第一种做法:这种方法,算法复杂性大,重复的递归 #include "stdafx.h" #include<iostream> #include<vector> ...
- Hive报错:Failed with exception Unable to rename
之前也安装过hive,操作过无数,也没发现什么错误,今天因为之前安装的hadoop不能用了,不知道为什么,老是提示node 0,所以重新安装了hadoop和hive.安装完测试hive创建表也没发现什 ...
- android 自定图库(转)
githup: https://github.com/pengjianbo/GalleryFinal GalleryFinal简介 Android自定义相册,实现了拍照.图片选择(单选/多选). 裁剪 ...
- Android TextView setText卡顿问题
TextView 是经常使用控件之中的一个,最经常使用的方法是setText() . 可是 我们在显示大量的文本的时候,使用setText还是会有一些性能的问题. 这篇文章 关于TextView的s ...
- Encoding::CompatibilityError: incompatible character encodings: GBK and UTF-8
直接grunt serve读的css是.tmp/css/main.css 而这个文件不通过build生成出来是这样: /* Encoding::CompatibilityError: incompat ...
- 关于EF输出sql的执行日志
sqlserver中可以使用sql profiler:但是mysql当中无法查看:只能借助于组件: ADO.NET Entity Framework CodeFirst 如何输出日志(EF4.3) 用 ...
- ADAS
1 什么是ADAS advanced driver assistance system,即高级驾驶员辅助系统.是基于车上各种传感器的应用,如摄像头.雷达.激光器等. 2 ADAS的构成部分 2.1 a ...
- WePY根据环境变量来改变运行时的参数
WePY根据环境变量来改变运行时的参数 · Tencent/wepy Wiki https://github.com/Tencent/wepy/wiki/WePY%E6%A0%B9%E6%8D%AE% ...