题目: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 解密运算 —— 思路的更多相关文章

  1. bzoj 4104 [Thu Summer Camp 2015]解密运算——思路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4104 想了很久,想出一个 nlogn (也许是 n2logn )的,可惜空间是 n2 . 已 ...

  2. 【BZOJ 4104】 4104: [Thu Summer Camp 2015]解密运算 (智商)

    4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 370  Solved: 237 De ...

  3. [Thu Summer Camp 2015]解密运算

    4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec  Memory Limit: 512 MB Description 对于一个长度为N的字符串,我 ...

  4. 【BZOJ4104】解密运算 [暴力]

    解密运算 Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 对于一个长度为N的字符串,我们在字 ...

  5. 【BZOJ 4104】【Thu Summer Camp 2015】解密运算

    http://www.lydsy.com/JudgeOnline/problem.php?id=4104 网上题解满天飞,我也懒得写了 #include<cstdio> #include& ...

  6. 【BZOJ 4104】【THUSC 2015】解密运算

    http://www.lydsy.com/JudgeOnline/problem.php?id=4104 网上题解满天飞,我也懒得写了 #include<cstdio> #include& ...

  7. LeetCode - 136. Single Number - ( C++ ) - 解题报告 - 位运算思路 xor

    1.题目大意 Given an array of integers, every element appears twice except for one. Find that single one. ...

  8. xml文件加密上传和sftp下载解密基本思路

    AES对称加密效率高,对大文件加密适合.RSA非对称加密效率低,更安全,对小文件加密适合. 整理 11:12 2016/8/4 加密:1.xml xml.md5摘要 2.(xml)aes加密 (xml ...

  9. BZOJ4104:[Thu Summer Camp 2015]解密运算——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4104 对于一个长度为N的字符串,我们在字符串的末尾添加一个特殊的字符".".之 ...

随机推荐

  1. 从epoll构建muduo-12 多线程入场

    mini-muduo版本号传送门 version 0.00 从epoll构建muduo-1 mini-muduo介绍 version 0.01 从epoll构建muduo-2 最简单的epoll ve ...

  2. Centos 7.0系统服务管理

    从Centos7开始,不再用sysvinit管理系统服务了,而是改用了systemd,因此对系统服务管理方法已经变更,以下简述 1.查看当前所有系统服务的状态 systemctl 2.查看指定系统服务 ...

  3. linux 上操作常用的命苦与出错的地方

    帮助信息 ./configure -help|grep mysql 出错提示安装libxml2 tar -zxvf libxml2xxxx.tar cd libxml2xxx ./configure ...

  4. leetCode 88.Merge Sorted Array (合并排序数组) 解题思路和方法

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: Y ...

  5. PHPCMS替换主页、列表页、内容页

    利用phpcms制作企业站,首先要将静态的企业主页替换成后台可编辑的动态主页. 在phpcms/install_package/phpcms/templates新建一个英文文件夹 在此文件夹下在创建一 ...

  6. live555二次开发经验总结:RTSPClient客户端与RTSPServer服务器

    live555介绍 安防领域的流媒体开发者估计没有谁不知道live555的,可能并不是因为其架构有多牛,代码有多好看,而是因为这玩意存在的年限实在是太长了,从changelog来看,live555从2 ...

  7. Hadoop实战-Flume之Source multiplexing(十五)

    a1.sources = r1 a1.sinks = k1 k2 a1.channels = c1 c2 # Describe/configure the source a1.sources.r1.t ...

  8. centos设置固定IP方法

    首先网络模式设为桥接 [root@centos64 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0HWADDR=00:0C:2 ...

  9. yhdsir@function:php

    curl 获取页面信息 function curl_get_content($url){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $u ...

  10. 复制一个带random指针的链表

    一个单链表,其中除了next指针外,还有一个random指针,指向链表中的任意某个元素.如何复制这样一个链表呢? 通过next来复制一条链是很容易的,问题的难点在于如何恰当地设置新链表中的random ...