bzoj 4104 [Thu Summer Camp 2015]解密运算——思路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4104
想了很久,想出一个 nlogn (也许是 n2logn )的,可惜空间是 n2 。
已知字符集,对它排个序,对应上给出的那些字符,就能知道每个字符前面是哪个字符。
这样得到了一些长度为2的串。这些长度为2的串一定也是这 n+1 行的开头;所以对它们排序后对应上给出的那些字符,就能得到长度为3的串。这样就能得到答案。
但是太慢。考虑已知长度为 k 的串,想一下把它接成 2*k 的串。
发现如果已经接好了,则对 2*k 的串排序,它们的前 k 个字符的顺序就和现在看见的长度为 k 的串的顺序一样。
所以对现在的长度为 k 的串排序,并再保留排序前的样子,然后考虑排序后的每个串接到排序前的哪个串上。
发现对长度为 2*k 的串排序就是以长度为 k 时排序前的串为第一关键字、长度为 k 的排序后的串为第二关键字的。
所以将长度为 k 的串排序后,已知每个串的上一个字符是什么;从前到后枚举排序后的长度为 k 的串,找到以该串对应字符结尾的那些串,在这个类别里找到第一个还没被接上的串,把自己接到该串后面。
这样一共 logn 层,每层大概是 O(n) ?不过还没想好怎么实现“接上去”,也许每层要变成 n2 了。
然后看了题解。
已知字符集和每个字符后面接着的那个串的字典序。
所以可以得到后面的那个串前面接上该字符后的新串的字典序。(形如“一个字符+一个串",并且已知“一个串”的不算那个字符时的字典序排名)
同时由给出的那些字符,把新串按字典序对应上,就能知道每个新串的上一个字符是什么。
“上一个字符+一个串”的样子就是一个新串的样子。所以知道这个新串对应的上一个字符,可以尝试直接找这个新串对应的新串。如果能找到的话,得到新的自身排名和上一个字符,就能顺着把原来新串的从最后一个位置开始的每一个“上一个字符”找出来,即找到了原串。
其实问题就在于如果有很多个“同一个字符+一个串”,不知道自己这个串应该接在其中的哪个后面。
但已经知道这些备选方案接着的那个串的字典序排名了;而且也知道自己这个串的字典序排名。所以按排名对应上就行啦!对应上之后又知道了自己串的新的排名和上一个字符,就能做下去了。
自己的思路要维护 n+1 个串,而且每次要排序。没有利用上“前续了一个字符后新串的排名已知”这个条件。
因为每次要前续一个字符,所以把给出的条件从“已知每个排名对应的上一个字符”转为“已知每个字符后面串的排名”,就能实现一直做下去。
看到后缀数组,自己总想着分析它的倍增,而最近这两道题都是从它的“后缀去掉开头字符后仍是一个已知后缀”的角度考虑。学习一下这个思路。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+;
int n,m,dy[N],prn[N];
struct Node{int a,b;}t[N];
bool operator< (Node u,Node v){return u.a<v.a||(u.a==v.a&&u.b<v.b);}
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
int main()
{
n=rdn();m=rdn();
for(int i=,d;i<=n+;i++)
{
t[i].a=rdn(); t[i].b=i;
}
sort(t+,t+n+);
for(int i=;i<=n+;i++)dy[t[i].b]=i;
int cr=,bj=n;
while(bj)
{
cr=dy[cr];prn[bj--]=t[cr].a;
}
for(int i=;i<=n;i++)printf("%d ",prn[i]);puts("");
return ;
}
bzoj 4104 [Thu Summer Camp 2015]解密运算——思路的更多相关文章
- 【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的字符串,我 ...
- bzoj:4105: [Thu Summer Camp 2015]平方运算
Description Input 第一行有三个整数N,M,p,分别代表序列的长度.平方操作与询问操作的总次数以及在平方操作中所要模的数. 接下来一行N个数代表一开始的序列{X1,X2,... ...
- BZOJ4104:[Thu Summer Camp 2015]解密运算——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4104 对于一个长度为N的字符串,我们在字符串的末尾添加一个特殊的字符".".之 ...
- bzoj4104 [Thu Summer Camp 2015]解密运算
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4104 [题解] 脑洞+找规律做出来的.. 我用样例作为说明吧 样例给了我们这个 AAAC.A ...
- BZOJ4104 [Thu Summer Camp 2015]解密运算 【乱搞】
题目链接 BZOJ4104 题解 我们将已知字符排序,由循环就可以得到一个对应关系 如样例就是: 0->第5行 1->第1行 1->第2行 1->第3行 1->第5行 2 ...
- [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】
题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF ...
- BZOJ 4103: [Thu Summer Camp 2015]异或运算 可持久化trie
开始想了一个二分+可持久化trie验证,比正解多一个 log 仔细思考,你发现你可以直接按位枚举,然后在可持久化 trie 上二分就好了. code: #include <bits/stdc++ ...
- 4105: [Thu Summer Camp 2015]平方运算
首先嘛这道题目只要知道一个东西就很容易了:所有循环的最小公约数<=60,成一条链的长度最大为11,那么我们就可以用一个很裸的方法.对于在链上的数,我们修改直接暴力找出并修改.对于在环上的数,我们 ...
随机推荐
- JAVA基础补漏--反射
获得CLASS的三种方式: 1.Class.forname("全类名"):将字节码文件加载进内存,返回Class对象. 多用于配置文件,将类名放到配置文件中,读取配置文件,加载类 ...
- [Bzoj]5343: [Ctsc2018]混合果汁
5343: [Ctsc2018]混合果汁 题目描述 小 R 热衷于做黑暗料理,尤其是混合果汁. 商店里有 \(n\) 种果汁,编号为 \(0,1,\cdots,n-1\) .\(i\) 号果汁的美味度 ...
- Java集合Collection&Map
Map<K,V>是键值对,K - 此映射所维护的键的类型,V - 映射值的类型.键值是一一对应的关系: Collection是只有键,底层也是由键值对,但是值的类型被隐藏起来. Colle ...
- windchill系统——导航器v1.0:思维导图
总图 思维导图图片链接 http://www.edrawsoft.cn/viewer/public/s/7b3fc783493788
- python 中 正则表达式 的应用
python 中 正则表达式 的应用 最近作业中出现了正则表达式,顺便学习了一下. python比较厉害的一点就是自带对正则表达式的支持,用起来很方便 正则表达式 首先介绍一下什么是正则表达式. 正则 ...
- 使用mysqldump迁移数据
1. 先停止业务,使用MySQLdump的数据导出工具,将您线下原有数据库数据导出为数据文件 mysqldump -hlocalhost -uroot --default-character-set= ...
- sqoop数据导入到Hdfs 或者hive
用java代码调用shell脚本执行sqoop将hive表中数据导出到mysql http://www.cnblogs.com/xuyou551/p/7999773.html 用sqoop将mysql ...
- NVMe到底是什么?用它的SSD有啥优势?
有玩过SSD的朋友应该都清楚想要让SSD发挥出真正实力的话要去BIOS里面把SATA控制器模式切换成AHCI,对SATA设备来说使用AHCI模式的确是正确的选择,切换成AHCI可获得更好的性能.但是现 ...
- 如何在深层嵌套ngRepeat中获取不同层级的$index
<ul class="list-group" ng-repeat="item in vm.appData" ng-init="outerInde ...
- python递归列出目录及其子目录下所有文件
python递归列出目录及其子目录下所有文件 一.前言 函数的递归,简单来说,就是函数内部调用自己 先举个小例子,求阶乘 def factorial(n): if n == 0: return 1 e ...