欢迎光临散文网 会员登陆 & 注册

CF竞赛题目讲解_CF835D(区间DP+回文字符串)

2022-09-03 16:27 作者:Clayton_Zhou  | 我要投稿

https://codeforces.com/contest/835/problem/D


题意:

一个字符是 1 级回文。一个字符串是 k 级回文当且仅当下面条件成立:


1. 它的左边一半与右边一半对称,如果字符串长度为7,则一半长度为3;

2. 它的左边和右边一半都是非空的 k−1 回文。

左半字符串 t 的前缀长度为 ⌊t|2⌋,右半字符串是同样长度的后缀。⌊t|2⌋ 是字符串 t 的长度除以 2 以后向下取整。


Note that each substring is counted as many times as it appears in the string.

如果一个回文子串出现多次,则也被计数多次。


题解:

使用区间 dp 进行计算。设 dp[L][r] 表示区间 [L,r] 是几级回文串。

如果不是回文串则值为 0。先预处理出 dp[i][i] 的值。之后,转移方程为:


1. 若 s[L]≠s[r] 或者 dp[L+1][r−1]=0,则 dp[L][r]=0。


2. 若 s[L]=s[r] 且 dp[L+1][r−1]≠0,那么 dp[L][r] = dp[L][L + len / 2 - 1]+1


ans 数组先记录每级回文串有多少个,然后再加上所有大于当前回文串级数的回文串个数。

例如:2级回文串 也是 1级回文串


CF竞赛题目讲解_CF835D(区间DP+回文字符串)的评论 (共 条)

分享到微博请遵守国家法律