题目链接: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 中增加css样式的三种方式

    增加css样式的三种方式: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  2. MySQL-exists和in的区别

    SQL查询中in和exists的区别分析 对于一些不可不免的查询场景,我们难免要用到子查询 那么in和exists那个的效率更高一点呢 SQL查询中in和exists的区别分析 select * fr ...

  3. ES6系列之箭头函数

    本系列是在平时阅读.学习.实际项目中有关于es6中的新特性.用发的简单总结,目的是记录以备日后温习:本系列预计包含let/const.箭头函数.解构.常用新增方法.Symbol.Set&Map ...

  4. 【转录组入门】6:reads计数

    作业要求: 实现这个功能的软件也很多,还是烦请大家先自己搜索几个教程,入门请统一用htseq-count,对每个样本都会输出一个表达量文件. 需要用脚本合并所有的样本为表达矩阵.参考:生信编程直播第四 ...

  5. SUID、SGID详解

    文章转载至:http://tech.ccidnet.com/art/2583/20071030/1258885_1.html 如果你对SUID.SGID仍有迷惑可以好好参考一下! Copyright ...

  6. 通过SQLServer的数据库邮件来发送邮件

    前段时间需要做一个发送邮件的功能,于是就花了一点时间研究了一下.发现通过SQLServer就可以发送邮件,只需要配置一下就可以了,而且配置过程很简单.下面来说一下配置过程: 1.启用Database ...

  7. JQuery 中的选择器

    选择器:允许通过标签名,属性名或内容对DOM元素进行快速,准确的选择,浏览器兼容性很好. 普通选择器 选择器 功能 返回值 #id 根据给定的ID匹配一个元素 单个元素 element 根据给定的元素 ...

  8. CSS画三角形图标

    /* 等腰三角形(箭头朝上): */ #div1{ width: 0; height: 0; border-bottom: 100px solid cyan; border-left: 50px so ...

  9. Java高级框架——Mybatis(二)

    十.三种查询方式 1. selectList()返回值为List<resultType属性控制> 1.1 适用于查询结果都需要遍历的需求 List<Flower> list = ...

  10. 20165205 《网络对抗技术》 Exp0 Kali安装

    20165205 <网络对抗技术> Exp0 Kali安装 一.下载及安装 打开官方下载网站 我下载的是vm版,64位,如下图 之后继续点击 之后就可以等待下载成功了,成功之后找到.vmx ...