首页 > 其他分享 >[luoguP4051/JSOI2007] 字符加密

[luoguP4051/JSOI2007] 字符加密

时间:2024-08-31 15:14:58浏览次数:9  
标签:字符 include JSOI2007 int 字符串 加密 sa 排序 luoguP4051

题意

给定字符串 \(s\),输出将 \(s\) 的所有循环同构的字符串排序后,每个字符串的末尾的字符。

sol

因为要对循环同构的字符串排序,因此我们可以将 \(s\) 复制一遍,拼在后面,计算 \(sa\),满足 \(sa_i \le n\) 的所有元素的相对位置即为排序后字符串的相对位置,输出即可
\(sa\) 的计算详见[luoguP3809]后缀排序

代码

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 200005;

char s[N];
int n;
int sa[N], rk[N], oldrk[N], cnt[N], scd[N];

void get_sa(){
    for (int i = 1; i <= n; i ++ ) cnt[rk[i] = s[i]] ++ ;
    for (int i = 1; i <= 128; i ++ ) cnt[i] += cnt[i - 1];
    for (int i = n; i; i -- ) sa[cnt[rk[i]] -- ] = i;

    for (int w = 1, m = 128, p = 0; ; m = p, p = 0, w <<= 1){
        for (int i = n - w + 1; i <= n; i ++ ) scd[ ++ p] = i;
        for (int i = 1; i <= n; i ++ )
            if (sa[i] > w) scd[ ++ p] = sa[i] - w;
        
        memset(cnt, 0, m + 1 << 2);
        memcpy(oldrk, rk, n + 1 << 2);

        for (int i = 1; i <= n; i ++ ) cnt[rk[i]] ++ ;
        for (int i = 1; i <= m; i ++ ) cnt[i] += cnt[i - 1];
        for (int i = n; i; i -- ) sa[cnt[rk[scd[i]]] -- ] = scd[i];
        
        p = 0;
        for (int i = 1; i <= n; i ++ ) rk[sa[i]] = (oldrk[sa[i]] == oldrk[sa[i - 1]] && oldrk[sa[i] + w] == oldrk[sa[i - 1] + w]) ? p : ++ p;

        if (p >= n) return ;
    }
}

int main(){
    scanf("%s", s + 1);
    n = strlen(s + 1);
    for (int i = 1; i <= n; i ++ ) s[i + n] = s[i];
    n <<= 1;

    get_sa();

    for (int i = 1; i <= n; i ++ ) 
        if (sa[i] <= (n >> 1)) printf("%c", s[sa[i] + (n >> 1) - 1]);

    return 0;
}

标签:字符,include,JSOI2007,int,字符串,加密,sa,排序,luoguP4051
From: https://www.cnblogs.com/XiaoJuRuoUP/p/18390344/luoguP4051

相关文章

  • U盘怎么加密保护?U盘加密软件哪个好?
    在工作和生活中,我们经常需要使用U盘来存储数据。而为了避免U盘数据泄露,我们需要加密保护U盘。那么,U盘加密软件哪个好呢?下面我们就一起来了解一下。BitLocker加密BitLocker是Windows系统提供的磁盘加密功能,可以加密保护U盘。但需要注意的是,该功能无法在家庭版系统中使用。......
  • 数据安全指南:电脑重要文件如何加密?
    在工作中,电脑是重要的办公工具,可以处理和保存大量数据。为了避免重要文件泄露,我们需要加密保护电脑重要文件。下面我们就来了解一下电脑重要文件的加密方法。EFS加密EFS是Windows系统提供的数据加密功能,基于公钥加密策略,采用透明加密方法。在加密文件时,不需要设置密码,通过......
  • RSA加密
    题目来源[BUUCTF]REVERSE——rsa打开文件夹有两个文件打开pub.key文件复制到解密网站对应RSA密钥指数E=65537,这一串模数可以转化为十进制后可以分离出p、qp=285960468890451637935629440372639283459,q=304008741604601924494328155975272418463所以已知E、p、q......
  • openGauss-透明数据加密
    openGauss-透明数据加密可获得性本特性自openGauss2.1.0版本开始引入。特性简介透明数据加密(TransparentDataEncryption),是数据库在将数据写入存储介质时对数据进行加密,从存储介质中读取数据时自动解密,防止攻击者绕过数据库认证机制直接读取数据文件中的数据,以解决静态数据......
  • nginx扩展之支持多个ssl加密虚拟主机
    nginx支持一台服务器唯一IP:PORT,根据server_name创建区分多个经过ssl加密的https虚拟主机,apache不支持 生成www.magedu.net域名证书:[[email protected]]#cd/etc/pki/tls/certs/[[email protected]]#vimMakefile%.key:umask77;\#/usr/bin/ope......
  • Python编码系列—Python中的HTTPS与加密技术:构建安全的网络通信
    ......
  • Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点在移动端开发中,数据加密是确保数据传输和存储安全的重要手段。常见的加密算法包括对称加密算法(如AES)、非对称加密算法(如RSA)、散列算法(如SHA-256),以及消息认证码(如......
  • 2024年超好用的公司加密软件分享|8款公司防泄密软件推荐
    数据安全已成为企业运营中不可忽视的重要环节。随着数据泄露事件频发,企业急需高效、可靠的加密软件来保护敏感信息。以下是2024年备受推崇的8款公司加密软件,它们以其强大的功能和卓越的性能,为企业数据防泄密提供了坚实的保障。1.安企神它是一款集文档加密、数据防泄漏、......
  • 电脑文件加密方式推荐:整合了10个文件加密软件,亲测好用!
    在这个数据安全至关重要的时代,电脑文件加密已成为保护个人和企业数据的必备措施。无论是保护敏感的工作文档、私人照片,还是防止商业机密外泄,文件加密软件都可以有效地防止未经授权的访问。本文将为您推荐10款亲测好用的文件加密软件,帮助您更好地保护您的数据安全。1.安秉加......
  • 10款主流图纸加密软件强力推荐|2024年图纸加密软件最佳选择!
    在现代商业环境中,企业图纸作为重要的知识产权和核心竞争力,一旦泄露可能会对企业造成严重的经济损失和竞争劣势。随着信息安全需求的不断提高,图纸加密软件的应用变得尤为重要。图纸加密不仅能够保护企业的技术机密,还能有效防止内部人员的恶意泄密。1.安秉图纸加密软件安秉图......