华丽地处理字符串

后缀数组 

将A和B拼接后,累计分属两者的后缀对应的LCP-K+1即为答案,但穷举不是个好主意。

如果能快速求出任意两个后缀的最长公共前缀的话,利用类似尺取法的技巧就可以在线性时间统计一段区间了。

而任意两个后缀的最长公共前缀为该区间的LCP值的最小值。hankcs.com 2017-02-08 下午11.34.17.png

在扫描一段LCA>=K的区域中,如果使用单调栈维护LCP,维护栈顶使LCP最小,就可以快速得到任意爬取区域的最长公共前缀。在“尺取法”爬取的过程中,更新出栈的元素对贡献值的影响,累积到答案中即可。

    #include <iostream>
    #include <string>
    #include <algorithm>
     
    const int MAX_L = 100000 + 1;
    const int MAX_N = 2 * MAX_L + 1;
    std::string S;
    int n, k;
    int sa[MAX_N + 1], lcp[MAX_N + 1];  // sa[i] := 字典序为i的后缀的起始下标;lcp[i] := S[sa[i]...]与S[sa[i+1]...]的最长公共前缀长度
    int rank[MAX_N + 1], tmp[MAX_N + 1];
     
    /
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 护眼 设计师:闪电赇 返回首页

打赏

tea_year

打赏买包烟哦

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付 29.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值