看了求后缀数组的倍增法之后很快就理解了,但是自己写的倍增法用map排序还是超时了。然后看了两天别人写的模板,题目是通过了,但感觉代码还是半懂半背的。以后多熟悉熟悉吧;

  • 后缀数组

    #include "bits/stdc++.h"
    using namespace std;
    const int MAXN = 1e6 + ;
    char s[MAXN];
    int sa[MAXN], rk[MAXN], height[MAXN];
    void getSa(char* s, int* sa, int n, int m) {
    int* x = (int*)calloc(MAXN, sizeof(int));
    int* y = (int*)calloc(MAXN, sizeof(int));
    int* cnt = (int*)calloc(MAXN, sizeof(int));
    for (int i = ; i <= n; i++) {
    cnt[x[i] = s[i]]++;
    }
    for (int i = ; i <= m; i++) {
    cnt[i] += cnt[i - ];
    }
    for (int i = n; i; i--) {
    sa[cnt[x[i]]--] = i;
    }
    for (int j = ; j < n; j <<= ) {
    int num = ;
    for (int i = n - j + ; i <= n; i++) {
    y[++num] = i;
    }
    for (int i = ; i <= n; i++) {
    if (sa[i] > j) {
    y[++num] = sa[i] - j;
    }
    }
    for (int i = ; i <= m; i++) {
    cnt[i] = ;
    }
    for (int i = ; i <= n; i++) {
    cnt[x[i]]++;
    }
    for (int i = ; i <= m; i++) {
    cnt[i] += cnt[i - ];
    }
    for (int i = n; i; i--) {
    sa[cnt[x[y[i]]]--] = y[i];
    }
    swap(x, y);
    x[sa[]] = num = ;
    for (int i = ; i <= n; i++) {
    if (y[sa[i]] != y[sa[i - ]] || y[sa[i] + j] != y[sa[i - ] + j]) {
    x[sa[i]] = ++num;
    } else {
    x[sa[i]] = num;
    }
    }
    if (num >= n) {
    break;
    }
    m = num;
    }
    free(x);
    free(y);
    free(cnt);
    }
    void getHeight(char* s, int* sa, int* rk, int* height, int n) {
    for (int i = ; i <= n; i++) {
    rk[sa[i]] = i;
    }
    int k = ;
    for (int i = ; i <= n; i++) {
    k = k != ? k - : k;
    int j = sa[rk[i] - ];
    while (s[i + k] == s[j + k]) {
    k++;
    }
    height[rk[i]] = k;
    }
    }
    int main() {
    gets(s + );
    int len = strlen(s + );
    getSa(s, sa, len, );
    // getHeight(s, sa, rk, height, len);
    for (int i = ; i < len; i++) {
    printf("%d ", sa[i]);
    }
    printf("%d\n", sa[len]);
    /*
    for (int i = 1; i < len; i++) {
    printf("%d ", rk[i]);
    }
    printf("%d\n", rk[len]);
    for (int i = 1; i < len; i++) {
    printf("%d ", height[i]);
    }
    printf("%d\n", height[len]);
    */
    return ;
    }

    附带rank数组和height数组,本题不需要。

洛谷-P3809-后缀排序(后缀数组)的更多相关文章

  1. [洛谷P3809]【模板】后缀排序

    [洛谷P3809][模板]后缀排序 题目大意: 对于给定的长度为\(n(n\le10^6)\)的字符串求后缀数组\(sa[i]\). 思路: 倍增+快排构造后缀数组.代码参考<挑战程序设计竞赛& ...

  2. UOJ #35. 后缀排序[后缀数组详细整理]

    #35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符 ...

  3. Uoj #35. 后缀排序(后缀数组)

    35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在 ...

  4. Codevs 1500 后缀排序(后缀数组)

    1500 后缀排序 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 天凯是MIT的新生.Prof. HandsomeG给了他一个 ...

  5. [洛谷P2127] 序列排序

    洛谷题目链接:序列排序 题目描述 小C有一个N个数的整数序列,这个序列的中的数两两不同.小C每次可以交换序列中的任意两个数,代价为这两个数之和.小C希望将整个序列升序排序,问小C需要的最小代价是多少? ...

  6. 洛谷P3809 后缀排序【后缀数组】【模板】

    题目背景 这是一道模板题. 题目描述 读入一个长度为 nn 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编 ...

  7. 【后缀数组】洛谷P3809模板题

    题目背景 这是一道模板题. 题目描述 读入一个长度为 n n n 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置. ...

  8. 洛谷P3809 后缀数组模板

    题目:https://www.luogu.org/problemnew/show/P3809 刚学了后缀数组,看人家手写演示了半天,大概明白了过程,但完全写不出来代码: 于是借鉴了许多,不过都差不多, ...

  9. 洛谷.3809.[模板]后缀排序(后缀数组 倍增) & 学习笔记

    题目链接 //输出ht见UOJ.35 #include<cstdio> #include<cstring> #include<algorithm> const in ...

随机推荐

  1. matlab初级

    命令 ======== 系统命令 命令 功能 例 date 显示当前日期 ans = 20-Jul-2019 what 当前文件夹下的matlab文件   type 文件中的内容 type CV.m ...

  2. 自定义的listbox支持拖放

    unit unit2; interface uses Classes, Controls, StdCtrls; type TListBox2 = class(TCustomListBox) prote ...

  3. c#学习笔记01——引用&类

    数据类型 值类型 bool 布尔值 True 或 False False byte 8 位无符号整数 0 到 255 0 char 16 位 Unicode 字符 U +0000 到 U +ffff ...

  4. thrift生成c++服务端和客户端

    https://blog.csdn.net/jdx0909/article/details/84727523 https://blog.csdn.net/luoyexuge/article/detai ...

  5. iPhoneX的后遗症要持续多久?

    iPhone X的推出算得上苹果历史上的大事件,这款梳着刘海头型的手机作为iPhone十周年纪念款手机,承载着苹果和整个产业链巨大的希望,正因如此,包括苹果在内的大量企业,把宝都压到了这款手机上.后来 ...

  6. jQuery ajax中的dataType——JSON和JSONP

    引用:http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html [原创]说说JSON和JSONP,也许你会豁 ...

  7. Python笔记_第三篇_面向对象_1.面向对象的基本概念和作用域

    1. 软件编程的实质: 软件编程就是将我们的思维转变成计算机能够识别语言的一个过程.重要的是思想,代码技术反而次要.因此思想也是最难的,突破固定的思想是关键 2. 什么是面向过程: * 自上而下顺序执 ...

  8. 基于JSP+Servlet开发在线租车系统 java 源码

    运行环境: 最好是java jdk 1.8,我们在这个平台上运行的.其他版本理论上也可以.IDE环境: Eclipse,Myeclipse,IDEA都可以tomcat环境: Tomcat 7.x,8. ...

  9. Codeforces Round #316 (Div. 2) D计算在一棵子树内某高度的节点

    题:https://codeforces.com/contest/570/problem/D 题意:给定一个以11为根的n个节点的树,每个点上有一个字母(a~z),每个点的深度定义为该节点到11号节点 ...

  10. PAT甲级——1108.Finding Average (20分)

    The basic task is simple: given N real numbers, you are supposed to calculate their average. But wha ...