首页 > 其他分享 >模板-字符串

模板-字符串

时间:2022-09-03 15:24:50浏览次数:79  
标签:子串 curr 后缀 int 字符串 sa 模板 rk

后缀数组

用倍增求得后缀数组, o(nlogn):

  1. 求得后缀排名rk, 即排名的后缀sa
LL n;// 下标从1开始
char s[N];
int sa[N], rk[N], rk2[N], ht[N];

void getSa() {// 根据rk来倍增排序sa
    // initialized, 长度为1
    ltr(i, 1, n) { sa[i] = i, rk[i] = s[i]; }

    for (int k = 1; k <= n; k *= 2) {
        auto cmp = [&](int i, int j) {// 比较前一半和后一半
          if (rk[i] != rk[j])return rk[i] < rk[j];

          int r1 = (i + k <= n ? rk[i + k] : -1),
              r2 = (j + k <= n ? rk[j + k] : -1);
          return r1 < r2;
        };

        sort(sa + 1, sa + 1 + n, cmp);

        rk2[sa[1]] = 1;// 基数排序
        ltr(i, 1, n) rk2[sa[i]] = rk2[sa[i - 1]] + cmp(sa[i - 1], sa[i]);

        ltr(i, 1, n)rk[i] = rk2[i];
    }
}

void getHt() {
    ltr(i, 1, n)rk[sa[i]] = i;

    int k = 0;
    ltr(i, 1, n) {// 枚举排名第i-1和i名, 更新ht
        if (k)--k;// 去掉首字母, 重新比较

        int j = sa[rk[i] - 1];
        while (i + k <= n && j + k <= n && s[i + k] == s[j + k])++k;

        ht[rk[i]] = k;
    }
}

  1. 可求得第k小子串

    CF128B string

// 每个后缀的前缀就是所有子串, 又后缀按照字典序作sa排序, 所以我们开a数组统计拓展, 直至ht, 以防重复
int a[N];// rk为i的后缀被提供(扩展)多少子串
//寻找第K小的子串
void findK(int k) {
    int curr = 1;
    while (k) {
        if (++a[curr] > n - sa[curr] + 1) {// 扩展当前后缀的前缀长度, 若超出, 则去到下一个后缀
            ++curr;
            continue;
        }
        --k;
        // 扫描并扩展包含当前相同子串, 扩展部分应小于lcp
        for (int i = curr + 1; i <= n && a[curr] <= ht[i] && k; ++i) {
            ++a[i], --k;
        }
    }
    ltr(i, 0, a[curr] - 1) {
        cout << s[sa[curr] + i];
    }
}

标签:子串,curr,后缀,int,字符串,sa,模板,rk
From: https://www.cnblogs.com/LiamEvander/p/16652647.html

相关文章

  • Golang字符串库函数(常用)
    Golang基础-3字符串系统函数统计字符串长度按字节进行统计len(str)这是个内置函数,不用额外导包注意在golang中用的是utf-8编码,字母是一个字节,汉字是三个字节字符串的......
  • 模板-数论
    原来源:dian巨阶乘逆元求组合数在做D-MadokaandTheCorruptionScheme时,一个满二叉树的走法就是C(n,i),在n轮中赢几场,最终就是杨辉三角前缀和template<type......
  • Codeforces Round #719 (Div. 3) E. Arranging The Sheep(字符串)
    https://codeforces.com/contest/1520你在玩“放羊”游戏。这个游戏的目标是让羊排好队。游戏中的关卡由一个长度为n的字符串描述,由字符“.”组成(空格)和'*'(羊)。......
  • Django数据传递与模板语法
    Django数据传递与模板语法视图函数返回值1.视图函数的返回值其实本质上返回的都是HttpResponse对象,HttpResponse其实是一个类,我们最常使用的render和redirect都是这个类......
  • 视图层与模板层
    网页伪静态伪静态页面其实是动态页面,只是看起来和静态页面一样,将动态网页伪装成静态网页,可以提升网页被搜索引擎收录的概率,表现上网址看的像一个具体的文件路径deftest(......
  • 【Django】 第04回 视图层与模板层
    目录1.网页伪静态2.视图层2.1视图函数的返回值问题2.2视图函数返回json格式数据2.3from表单携带文件数据2.4FEV与CBV2.5CBV源码分析3.模板层3.1模板语法传值3.2......
  • 【luogu P5056】【模板】插头dp(插头DP)(分类讨论)
    【模板】插头dp题目链接:luoguP5056题目大意有一个n*m的网格,每个格子要么必须铺线,要么必须不铺。然后问你有多少个铺发使得形成一个闭合回路。思路快乐插头DP模......
  • django之视图层与模板层
    一、伪静态网页'''其实就是如果一个网页如果是一个静态网页的话那么浏览器搜索会更容易搜索的到而如果一个动态网页想要让浏览器更容易搜索到的话可以在路由匹配的时......
  • SQL server 字符串补位
     示例selectspace(10)+'*'左补10个空格,'*'+space(10)右补10个空格,replicate('*',10)+'*'左补10个*,*+replicate('*',10)右补10个* SPACE......
  • 在长字符串上创建索引
    目录背景解决方案1、创建示例表2、初始化数据3、查询3.1、确定区分度3.2、创建索引背景当在很长的字符串的字段上创建索引时,索引会变得很大而且低效。解决方案1、创建......