题意:给出一个字符串,问其中有多少个子串恰好为\(uvu\)的形式。其中,\(u\)非空,\(v\)的长度恰好为\(l\)。

\(n \leq 5 \times 10^4\)

我们设两个后缀的起点分别为\(a,b \, (a < b)​\),那么,它们能贡献一个合法的子串当且仅当\(lcp(a,b) + l \geq b - a​\)。这样,我们得到了\(O(n^2)​\)的暴力。

由于\(lcp(a,b)\)和\(b-a\)没有什么关系,所以我们考虑枚举\(b-a\)。设\(b-a = s\)。那么,答案中\(u\)的长度就要满足\(|u| \geq s - l\)。因此,我们可以忽视长度小于\(s-l\)的字符串。

考虑这样一种做法:枚举\(s-l\),并且把字符串分成\(\left\lceil \frac {n} {s-l} \right\rceil\)段,于是产生\(O \left(\frac {n} {s-l} \right)\)个端点。我们发现,所有满足\(|u| \geq s-l\)的子串\(u\)都至少覆盖一个端点。因此,我们枚举所有端点,并计算所有覆盖它的子串对答案的贡献。为了避免重复计算,我们只在一个子串覆盖的最右边的端点计算它的贡献。

现在,我们已有一个端点\(p\),那么另一个\(u\)的起点就在\(p + s\)。那么,只要求出\(lcp(p,p+s)\)和\(lcs(p,p+s)\),我们就能得出所有以\(p\)为其覆盖的最后一个端点的可能的\(u\)的数量。

因为\(H_n = \ln n + O(1)\),所以如果使用\(O(1)\)的lcs和lcp,时间复杂度是\(O(n \log n)\)的。(但博主写了\(O(n \log^2 n)\)。

#include <bits/stdc++.h>
using namespace std;
const int N = 80010, BAS = 233;
typedef unsigned long long ull;
ull has[N],mul[N];
long long ans;
int n,l;
char s[N];
ull gethas(int a,int b) {
return has[b] - has[a-1] * mul[b-a+1];
}
bool check(int a,int b,int c,int d) {
return gethas(a,b) == gethas(c,d);
}
int lcs(int a,int b) {
int l = 0, r = min(a,b), ret = 0, mid;
while (l <= r) {
mid = (l + r) >> 1;
if (check(a-mid+1,a,b-mid+1,b)) l = mid + 1, ret = mid;
else r = mid - 1;
}
return ret;
}
int lcp(int a,int b) {
int l = 0, r = min(n - a + 1, n - b + 1), ret = 0, mid;
while (l <= r) {
mid = (l + r) >> 1;
if (check(a,a+mid-1,b,b+mid-1)) l = mid + 1, ret = mid;
else r = mid - 1;
}
return ret;
}
int main() {
scanf("%d",&l);
scanf("%s",s+1);
n = strlen(s+1);
for (int i = 1 ; i <= n ; ++ i)
has[i] = has[i-1] * BAS + s[i];
mul[0] = 1;
for (int i = 1 ; i <= n ; ++ i)
mul[i] = mul[i-1] * BAS;
for (int s = 1 ; s <= n ; ++ s) {
for (int i = 1, j = 1 + s + l, a, b ; j <= n ; i += s, j += s) {
a = lcs(i,j);
b = lcp(i,j);
if (b > s) continue;
ans += max(0,a + b - s);
}
}
printf("%lld\n",ans);
return 0;
}

小结:一些基本套路都不会……字符串能力有待提高。

【做题】BZOJ2534 L-gap字符串——调和级数的更多相关文章

  1. 「BZOJ 2534」 L - gap字符串

    「BZOJ 2534」 L - gap字符串 题目描述 有一种形如 \(uv u\) 形式的字符串,其中 \(u\) 是非空字符串,且 \(v\) 的长度正好为 \(L\), 那么称这个字符串为 \( ...

  2. l洛谷 P3926 SAC E#1 - 一道不可做题 Jelly

    P3926 SAC E#1 - 一道不可做题 Jelly 题目背景 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢吃蒟蒻果冻.而SOL菌也很喜欢蒟蒻果冻. 有一 ...

  3. SDOI2016 R1做题笔记

    SDOI2016 R1做题笔记 经过很久很久的时间,shzr终于做完了SDOI2016一轮的题目. 其实没想到竟然是2016年的题目先做完,因为14年的六个题很早就做了四个了,但是后两个有点开不动.. ...

  4. 【做题】BZOJ2342 双倍回文——马拉车&并查集

    题意:有一个长度为\(n\)的字符串,求它最长的子串\(s\)满足\(s\)是长度为4的倍数的回文串,且它的前半部分和后半部分都是回文串. \(n \leq 5 \times 10^5\) 首先,显然 ...

  5. Sam做题记录

    Sam做题记录 Hihocoder 后缀自动机二·重复旋律5 求一个串中本质不同的子串数 显然,答案是 \(\sum len[i]-len[fa[i]]\) Hihocoder 后缀自动机三·重复旋律 ...

  6. 【Leetcode 做题学算法周刊】第二期

    首发于微信公众号<前端成长记>,写于 2019.11.05 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 20 ...

  7. 课后选做题-MyOD

    课后选做题-MyOD od命令的了解 功能 od命令用于将指定文件内容以八进制.十进制.十六进制.浮点格式或ASCII编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符.od命令系统默 ...

  8. [JSOI2019]节日庆典 做题心得

    [JSOI2019]节日庆典 做题心得 一个性质有趣的字符串题 这要是在考场上我肯定做不出来吧 一开始还以为要 SAM 什么的暴力搞,没想到只用到了 \(Z\) 函数 -- 也是我生疏了罢 (学了啥忘 ...

  9. NOIP初赛:完善程序做题技巧

    最近写的文章好像还很多的.那么今天我们来讨论NOIP初赛的题型--完善程序.完善程序相对是比较难的题目了.全卷100分,完善程序占了大概26分,占比非常大.如果和英语考试试卷做比较,相当于首字母填空( ...

  10. SAM 做题笔记(各种技巧,持续更新,SA)

    SAM 感性瞎扯. 这里是 SAM 做题笔记. 本来是在一篇随笔里面,然后 Latex 太多加载不过来就分成了两篇. 标 * 的是推荐一做的题目. trick 是我总结的技巧. I. P3804 [模 ...

随机推荐

  1. 运行vs时打开一个浏览器窗口,而不是在原有窗口上打开一个标签

    1.运行vs时打开一个浏览器窗口,而不是在原有窗口上打开一个标签,结束调试时窗口又关闭了,特别麻烦. 在用swagger调试接口时,好不容易输入了测试数据,然而窗口关闭了,再次调试又得重新输入. 解决 ...

  2. uvm设计分析——field automation

    uvm中的field_automation主要实现了class中的基础元素的copy,compare等函数, 实现方式分为两种:1)用户注册,field系列宏:uvm内部调用static status ...

  3. 事件响应模型(游戏引擎、JAVA中等应用)

    事件,我们在生活中时时在产生事件并且做出响应,如早晨出门时,看见外面下雨了,这时候我们需要带把伞等情况! 在现实生活之中事件分为人为事件和自然事件,那么在计算机操作系统中也不例外,存在两种事件 1.人 ...

  4. python绝对路径的表述方式 及 字符串的转义

    当我们打开某文件的路径时,应该时刻注意绝对路径的表示方法,例如打开某个txt文件时 1, with open(‘d:\77\111.txt’) as  f: f.read() 此时会报错  ,路径被反 ...

  5. HighCharts学习笔记(一)

    HighChars基本概述 Highcharts是一个纯js写成的插件库,很好的外观表现可以满足任何图标需求. 开始使用chart之前进行配置 全局配置: Highcharts.setOptions( ...

  6. [C#]Socket通信BeginReceive异步接收数据何时回调Callback

    原文地址:http://www.cnblogs.com/wangtonghui/p/3277303.html 最近在做服务器压力测试程序. 接触了一段时间Socket异步通讯,发现自己对BeginRe ...

  7. python 试题归纳及答疑 更新中.....

    一.Python基础篇(80题) 1.你为什么学习Python? 一.答题思路 1.阐述 python 优缺点 2.Python应用领域说明 3.根据自身工作情况阐述为什么会使用python 1)py ...

  8. QT 继承QWidget && 继承QDialog

    工作项目中,利用到Qt对话框,场景需求: 1. 一部分窗体需要继承自QWidget 2. 一部分窗体需要继承自QDialog 3. 两者均需要去掉标题栏图标,同时能够自由拖动. 如果两者分开继承实现, ...

  9. spring aop 执行顺序

    aop 执行顺序: // @Before // @AfterThrowing order 值越小,执行时越靠前 // @After // @AfterReturning order 值越大,执行时越靠 ...

  10. 使用函数式编程消除重复无聊的foreach代码(Scala示例)

    摘要:使用Scala语言为例,展示函数式编程消除重复无聊的foreach代码. 难度:中级 概述 大多数开发者在开发生涯里,会面对大量业务代码.而这些业务代码中,会发现有大量重复无聊的 foreach ...