2022春每日一题:Day 18

题目:[JSOI2007]字符加密
很常见的做法,破环为链,然后以2n为总长再后缀排序,然后对于SA[i] < n 的,说明第i小后缀的编号是小于n的,也就是说,以i开头的编号是合法的,那么输出s[SA[i]+n-1]即可。
代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
const int N = 2e5 + 5;
using namespace std;
int n, rk[N], sa[N], psa[N], k1[N], k2[N], cnt[N], m, len;
char s[N];
int main()
{
scanf("%s", s);
n = strlen(s);
for(int i = 0; i < n; i++)
s[i + n] = s[i];
len = n << 1;
m = max(len, 300);
for(int i = 0; i < len; i++)
cnt[(int)s[i]]++;
for(int i = 1; i < m; i++)
cnt[i] += cnt[i - 1];
for(int i = 0; i < len; i++)
rk[i] = cnt[(int)s[i]] - 1;
for(int w = 1; w < len; w<<=1)
{
for(int i = 0; i < len; i++)
{
if(i + w >= len)
k2[i] = 0;
else
k2[i] = rk[i + w];
k1[i] = rk[i];
}
for(int i = 0; i < m; i++)
cnt[i] = 0;
for(int i = 0; i < len; i++)
cnt[k2[i]]++;
for(int i = 1; i < m; i++)
cnt[i] += cnt[i - 1];
for(int i = len - 1; i >= 0; i--)
psa[--cnt[k2[i]]] = i;
for(int i = 0; i < m; i++)
cnt[i] = 0;
for(int i = 0; i < len; i++)
cnt[k1[i]]++;
for(int i = 1; i < m; i++)
cnt[i] += cnt[i - 1];
for(int i = len - 1; i >= 0; i--)
sa[--cnt[k1[psa[i]]]] = psa[i];
int pos = 1;
rk[sa[0]] = 1;
for(int i = 1; i < len; i++)
if(k1[sa[i]] == k1[sa[i - 1]] && k2[sa[i]] == k2[sa[i - 1]])
rk[sa[i]] = pos;
else
rk[sa[i]] = ++pos;
if(pos == len)
break;
}
for(int i = 0; i < len; i++)
rk[sa[i]] = i;
for(int i = 0; i < len; i++)
if(sa[i] < n)
printf("%c", s[(sa[i] + n - 1)]);
return 0;
}
2022春每日一题:Day 18的更多相关文章
- <每日一题>题目18:对象组合和对象构造面试题(深度优先和广度优先的问题)
class Node(object): def __init__(self,sName): self._lChildren = [] self.sName = sName def __repr__(s ...
- CISP/CISA 每日一题 18
CISSP 每日一题(答)What is the purpose of an access review and audit? Checkto ensure that users do not hav ...
- 【Java每日一题】20161018
20161017问题解析请点击今日问题下方的"[Java每日一题]20161018"查看 package Oct2016; public class Ques1018 { publ ...
- 老男孩IT教育-每日一题汇总
老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...
- [每日一题]面试官问:for in和for of 的区别和原理?
关注「松宝写代码」,精选好文,每日一题 时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...
- [每日一题]面试官问:谈谈你对ES6的proxy的理解?
[每日一题]面试官问:谈谈你对ES6的proxy的理解? 关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...
- 【JavaScript】Leetcode每日一题-二叉搜索树的范围和
[JavaScript]Leetcode每日一题-二叉搜索树的范围和 [题目描述] 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和. 示例1: 输入: ...
- 【JavaScript】【dp】Leetcode每日一题-解码方法
[JavaScript]Leetcode每日一题-解码方法 [题目描述] 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : 'A' -> 1 'B' -> 2 ... 'Z' -& ...
- LeetCode 每日一题「判定字符是否唯一」
我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复[资料],即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板. 题目 ...
- Java实习生常规技术面试题每日十题Java基础(六)
目录 1.在Java语言,怎么理解goto. 2.请描述一下Java 5有哪些新特性? 3.Java 6新特性有哪些. 4.Java 7 新特性有哪些. 5.Java 8 新特性有哪些. 6.描述Ja ...
随机推荐
- CF-1684C - Column Swapping
Problem - 1684C - Codeforces 题意: 现在有一个n*m的棋盘,每个棋子有一个值,你可以交换两列棋盘的棋子位置,使得每一行的棋子从左到右为非递减. 题解: 只需要判断一行不满 ...
- API接口签名校验(C#版)
我们在提供API服务的时候,为了防止数据传输过程被篡改,通常的做法是对传输的内容进行摘要签名,把签名串同参数一起请求API,API服务接收到请求后以同样的方式生成签名串,然后进行对比,如果签名串不一致 ...
- 可靠的自托管「GitHub 热点速览 v.22.37」
自托管(Self-Hosted) 是很多开源项目主打的亮点:数据在手,安全我有.本周 GitHub 热点榜单上有多款自托管的项目,当中自然不能少了之前 HG 小伙伴 @makes world simp ...
- 如何在Windows中查询证书颁发机构已颁发的证书
有时候需要看一下证书颁发机构已经颁发出去的证书,看看某个用户或者某个计算机获取过的证书有哪些.通常可以在证书颁发机构的MMC中查看.对于测试环境或者刚开始用的CA来说,这样查看挺简单的.但是对于用了一 ...
- SDN实验环境安装配置
- nginx配置文件中location的三个匹配规则定义
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说. #这里是直接转发给后端应用服务器了,也可以是一个静态首页 # 第一个必选规则 location = / { #prox ...
- Elasticsearch:significant terms aggregation
在本文中,我们将重点关注significant terms和significant text聚合.这些聚合旨在搜索数据集中有趣和/或不寻常的术语,这些术语可以告诉您有关数据的隐藏属性的更多信息.此功能 ...
- Kibana:Canvas入门
- Elasticsearch中的一些重要概念:cluster, node, index, document, shards及replica
首先,我们来看下一下如下的这个图: Cluster Cluster也就是集群的意思.Elasticsearch集群由一个或多个节点组成,可通过其集群名称进行标识.通常这个Cluster 的名字是可以在 ...
- 开启tcp_timestamps和tcp_tw_recycle造成NAT转发连接不上
文章转载自:https://segmentfault.com/a/1190000022264813