5.2知识精炼(一)高清版本.pdfVIP

  • 5
  • 0
  • 约1.63千字
  • 约 9页
  • 2025-03-21 发布于山东
  • 举报

知识精炼(一)

主讲人:邓哲也

Codeforces17E

给出一个字符串s。

求s有多少对相交的回文子串。包含也算作相交。

如babb一共有6对相交的回文子串:

s[1..1]ands[1..3]

s[1..3]ands[2..2]

s[1..3]ands[3..3]

s[1..3]ands[3..4]

s[3..3]ands[3..4]

s[3..4]ands[4..4]

|s|≤2·106

Codeforces17E

统计不相交的回文子串对数。

不相交的回文子串假设端点分别为x1,y1,x2,y2

那么一定有x1=y1x2=y2

我们只要统计出以i为起点的回文串个数st[i],和以i

为终点的回文串个数ed[i]。

然后计算:

෍ed[]෍[]

==+

Codeforces17E

在使用manacher算法的时候,对每个i都计算出了p[i]

那么我们就要把[i-p[i],i+p[i]]这个极大回文子串对st

和ed的贡献算进去。

对于st:[i-p[i],i]这些点每个位置都要+1

对于ed:[i,i+p[i]]这些点每个位置都要+1

只需要通过差分转化为单点修改即可。

最后用总的回文子串对数减去不相交的回文子串对数即是答案。

BZOJ2565

定义双回文串T,满足存在T=ab,其中a和b都是回

文串。

给定字符串S,求一个S的最长的双回文子串T。

|S|≤106

BZOJ2565

一个简单的想法,我们可以枚举ab中间的分界线。

然后两边分别计算能延伸出去的最长回文子串长度,然后相

加即可。

先考虑如何计算向左延伸的最长回文子串长度,向右的类似。

BZOJ2565

可以发现,向左的最长回文子串一定是manacher算法中

mx第一次覆盖的时候。

证明:设结尾为i的最长回文串的中点为p,半径为R

假设此时mx未覆盖i,那么p+Rmx与mx的定义矛

盾;

假设mx已经覆盖i,覆盖i的时候中点在p,半径为r,

11

若存在p,使得i-pi-p,那么p一定在p之前,而此

22121

时i未被覆盖,矛盾。

BZOJ2565

因此每次更新mx的时候,把mx对应的lmax赋值即可。

时间复杂度O(n)

倒过来就可以求一遍rmax。

最后取lmax[i]+rmax[i+1]的最大值即为答案。

下节课再见

文档评论(0)

1亿VIP精品文档

相关文档