题目:[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的更多相关文章

  1. <每日一题>题目18:对象组合和对象构造面试题(深度优先和广度优先的问题)

    class Node(object): def __init__(self,sName): self._lChildren = [] self.sName = sName def __repr__(s ...

  2. CISP/CISA 每日一题 18

    CISSP 每日一题(答)What is the purpose of an access review and audit? Checkto ensure that users do not hav ...

  3. 【Java每日一题】20161018

    20161017问题解析请点击今日问题下方的"[Java每日一题]20161018"查看 package Oct2016; public class Ques1018 { publ ...

  4. 老男孩IT教育-每日一题汇总

    老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...

  5. [每日一题]面试官问:for in和for of 的区别和原理?

    关注「松宝写代码」,精选好文,每日一题 ​时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  6. [每日一题]面试官问:谈谈你对ES6的proxy的理解?

    [每日一题]面试官问:谈谈你对ES6的proxy的理解? 关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  7. 【JavaScript】Leetcode每日一题-二叉搜索树的范围和

    [JavaScript]Leetcode每日一题-二叉搜索树的范围和 [题目描述] 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和. 示例1: 输入: ...

  8. 【JavaScript】【dp】Leetcode每日一题-解码方法

    [JavaScript]Leetcode每日一题-解码方法 [题目描述] 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : 'A' -> 1 'B' -> 2 ... 'Z' -& ...

  9. LeetCode 每日一题「判定字符是否唯一」

    我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复[资料],即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板. 题目 ...

  10. Java实习生常规技术面试题每日十题Java基础(六)

    目录 1.在Java语言,怎么理解goto. 2.请描述一下Java 5有哪些新特性? 3.Java 6新特性有哪些. 4.Java 7 新特性有哪些. 5.Java 8 新特性有哪些. 6.描述Ja ...

随机推荐

  1. KingbaseES 实现MYSQL hex/unhex 函数

    MySQL 的hex 和 unhex 函数类似于KingbaseES 的encode 和 decoding,实现字符与16进制之间的转换. 一.先看MySQL例子 mysql> select h ...

  2. EntityFrameworkCore 模型自动更新(下)

    话题 上一篇我们讨论到获取将要执行的迁移操作,到这一步为止,针对所有数据库都通用,在此之后需要生成SQL脚本对于不同数据库将有不同差异,我们一起来瞅一瞅 SQLite脚本生成差异 在上一篇拿到的迁移操 ...

  3. WSL 2简介

    Windows Subsystem for Linux(WSL)适用于 Linux 的 Windows 子系统是微软在Windows 10上提供的一项供用户快速运行Linux命令和工具的功能.相比前一 ...

  4. Windows LDAP加固之LDAP over SSL和通道绑定

    很多网络通信都可以用SSL来加密的,LDAP也不列外,同样可以用SSL加密. LDAPS使用的证书必须满足以下几个条件: 1.证书的增强性密钥用法中必须有服务器身份验证Server Authentic ...

  5. day01-项目开发流程

    多用户即时通讯系统01 1.项目开发流程 2.需求分析 用户登录 拉取在线用户列表 无异常退出(包括客户端和服务端) 私聊 群聊 发文件 服务器推送新闻/广播 3.设计阶段 3.1界面设计 用户登录: ...

  6. Idea插件SequenceDiagram快速查看方法调用

    Idea打开setting->plugins安装插件SequenceDiagram 快速查看方法调用 在方法名上右键点击SequenceDiagram即可生成方法调用图 最上面一行为该方法涉及的 ...

  7. Kibana:在Kibana 中定制 time picker 及 指标可视化显示格式

    文章转载自:https://blog.csdn.net/UbuntuTouch/article/details/107066779

  8. 第六章:Django 综合篇 - 12:聚合内容 RSS/Atom

    Django提供了一个高层次的聚合内容框架,让我们创建RSS/Atom变得简单,你需要做的只是编写一个简单的Python类. 一.范例 要创建一个feed,只需要编写一个Feed类,然后设置一条指向F ...

  9. PostgreSQL 删除表格

    PostgreSQL 使用 DROP TABLE 语句来删除表格,包含表格数据.规则.触发器等,所以删除表格要慎重,删除后所有信息就消失了. 语法 DROP TABLE 语法格式如下: DROP TA ...

  10. 2. 在 Kubernetes 上安装 Gitlab

    总结: 所需要的三个yaml文件的下载地址:https://files.cnblogs.com/files/sanduzxcvbnm/k8s-gitlab.zip Gitlab官方提供了 Helm 的 ...