题目链接:https://www.luogu.org/problemnew/show/P4051

思路:我们联想求后缀数组sa的过程,发现我们在求y数组的时候(第二关键字,下标为第二关键字的排位,值为合并之后关键字的位置),对于那些没有第二关键字的部分,我们都是直接补0,让这部分的第二关键字排在最前面,但是因为这道题是一个环,所以不存在没有第二关键字的情况,所以我们只需要在板子上面改点东西(求第二关键字的部分改一下),用取模来把范围控制在1到n之间就可以了。

这里因为可能有空格,所以我用gets来读取字符串了,把初始化为256,保险。

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<vector>
#include<set>
#include<cstdio>
#include<string>
#include<deque>
using namespace std;
typedef long long LL;
#define eps 1e-8
#define INF 0x3f3f3f3f
#define maxn 100005
int c[maxn],x[maxn],y[maxn],sa[maxn];
int n,m,k,t;
char s[maxn];
void output(int n){
    ;i<=n;i++){
        )%n+;//因为sa的下标表示排位,值表示位置,输出的那个末尾字符就是sa[i]+n-1
        //但是我们要控制范围,所以我们对n取模,取模可能为0,所以加1,
        //然后因为外面加了1,所以我们在括号里面减1,所以就是n-2了
        printf("%c",s[index]);
    }
    printf("\n");
}
void build_sa(int n){
    m=;
    ;i<=m;i++) c[i]=;
    ;i<=n;i++) c[x[i]=s[i]]++;
    ;i<=m;i++) c[i]+=c[i-];
    ;i--) sa[c[x[i]]--]=i;

    ;k<=n;k<<=){
        ;
        //去掉了补0的那部分,因为都存在第二关键字
        ;i<=n;i++)
        y[++num]=(sa[i]-k+n-)%n+;//我是下标从1开始,所以用取模操作把范围控制一下
        // 对n取模加1,在括号里面减1,这样就抵消了 

        ;i<=m;i++) c[i]=;
        ;i<=n;i++) c[x[i]]++;
        ;i<=m;i++) c[i]+=c[i-];
        ;i--) sa[c[x[y[i]]]--]=y[i],y[i]=;

        swap(x,y);
        num=,x[sa[]]=;
        ;i<=n;i++)
        x[sa[i]]=y[sa[i]]==y[sa[i-]]&&y[(sa[i]+k-)%n+]==y[(sa[i-]+k-)%n+]?num:++num;

        if(num>=n) break;
        m=num;
    }
    output(n);
}
int main()
{
    )){
        );
        build_sa(len);
    }
    ;
}

洛谷P4051 [JSOI2007]字符加密 后缀数组的更多相关文章

  1. 洛谷P4051 [JSOI2007]字符加密

    题目描述 喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法. 例如‘JSOI07’,可以读作 ...

  2. [JSOI2007]字符加密 后缀数组

    题面:洛谷 题解: 我们考虑,如果可以将环上每个长度为len的串都提取出来,再做个排序,那这题我们就做出来了! 但是提取$n^2$,怎么办? 考虑破环成链,再扩充为原来的2倍. 然后直接做后缀排序,把 ...

  3. 洛谷4051 JSOI2007 字符加密(SA)

    真是一道良好的SA模板题 首先,由于涉及到从左边移动到右边这个过程,我们不妨直接把字符串复制一遍,接在后面. 然后直接构造后缀数组,按排名从小到大,枚举所有的位置,如果这个后缀的起始点是在原串中的,那 ...

  4. BZOJ.1031.[JSOI2007]字符加密(后缀数组)

    题目链接 环可以拆成链:对字符串排序能想到后缀数组. 完了.输出时忽略长度不足n的串,输出s[sa[i]+n-1],即排名为i的字符串的末尾. //4140kb 744ms #include < ...

  5. 洛谷 4051 [JSOI2007]字符加密(后缀数组)

    题目描述 喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法. 例如‘JSOI07’,可以读作 ...

  6. P4051 [JSOI2007]字符加密 解题报告

    P4051 [JSOI2007]字符加密 题目描述 喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不 ...

  7. LG4051/BZOJ1031 「JSOI2007」字符加密 后缀数组

    问题描述 BZOJ1031 LG4051 题解 发现这是一个环,根据经验,破环为链,于是字符环变为了字符串 之后对这个复制之后的字符串求后缀数组. $len$代表原字符串长度,代表复制后的字符串长度 ...

  8. 洛谷P3763 [Tjoi2017]DNA 【后缀数组】

    题目链接 洛谷P3763 题解 后缀数组裸题 在BZOJ被卡常到哭QAQ #include<algorithm> #include<iostream> #include< ...

  9. luogu P4051 [JSOI2007]字符加密

    前言 其实就是个后缀数组模板题 可还是有几个的地方不太明白 思路 先将子串复制一遍,组成长度为2*n的子串 给出的子串一定会在前n个后缀 而且后面的优先级不会影响前面的相对大小 然后求得sa输出就好 ...

随机推荐

  1. python_项目_ATM和购物商城的程序

    1 需求 模拟实现一个ATM + 购物商城程序 额度15000或自定义 实现购物商城,买东西加入购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录 支持账户间转账 记录每月日常消费流水 ...

  2. Ubuntu16.04安装Python3.6 和pip(python3 各版本切换)

    安装: sudo add-apt-repository ppa:jonathonf/python-3.6 sudo apt-get update sudo apt-get install python ...

  3. [UE4]让Spline具象化

    接上一个实例 一.在TestSpline蓝图,切换到蓝图构造函数Constrction Script事件中,添加如下代码: 二.别忘记个Add Spline Mesh Component设置Stati ...

  4. promise规范之部分总结

    1. promise构造函数中的reject和resolve是微任务, 即先执行resolve后的代码,再执行之前通过then注册的代码 2. 对于状态已变更的promise来说,比如promiseA ...

  5. Linux 版 SecureCRT 界面变为 Windows 2000 风格的解决办法

    SecureCRT 是一款非常好用的远程终端连接软件,支持 Windows.Linux.macOS 全平台.由于现在工作平台主要在 Linux 系统上,SecureCRT 也是必备软件.一开始安装的是 ...

  6. 淘宝App直播宝贝数据采集

    淘宝App直播宝贝数据采集   前段时间,有人问我关于淘宝app直播频道宝贝如何采集?我尝试了下可以获取的到,模拟器登录不了淘宝,这里有一个坑就是,模拟器有时候会跳到登录页面,登录不了淘宝: 一.用A ...

  7. group by 拓展

    Oracle的group by除了基本使用方法以外,还有3种扩展使用方法,各自是rollup.cube.grouping sets.分别介绍例如以下: 1.rollup 对数据库表emp.如果当中两个 ...

  8. linux ubuntu生成pac文件,实现代理

    sudo pip install genpac sudo pip install --upgrade genpac sudo genpac --proxy="SOCKS5 127.0.0.1 ...

  9. ABAP笔记

    ABAP程序开发,经常会遇到报表开发需求.使用ABAP的Report类型程序开发报表十分便利,用很少的代码就可以快速开发出一个报表.这种报表需求,抛开各种细枝末节,都可以归结为“三步走”:1.选择屏幕 ...

  10. golang初识4 - Go 并发

    Go的CSP并发模型实现:M, P, G Go实现了两种并发形式.第一种是大家普遍认知的:多线程共享内存.其实就是Java或者C++等语言中的多线程开发.另外一种是Go语言特有的,也是Go语言推荐的: ...