[题解]CF245H Queries for Number of Palindromes
思路
定义 表示区间 中回文串的数量。那么,不难得出状态转移方程 。(其中 表示左端点大于等于 ,右端点为 的回文串数量)
由此,现在问题转变为了如何求 。如果我们在求出了 情况下, 就等于 再加上 是否是回文串。
判断回文串就很好求了,首先定义 表示 不是/是 一个回文串。
然后,固定一个初始的点,然后向外扩展即可。即,对于 ,有 。
Code
#include <bits/stdc++.h>
#define re register
using namespace std;
const int N = 5010;
int n,q;
int f[N][N],dp[N][N];
bool st[N][N];
string s;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> s >> q;
n = s.length();
s = ' ' + s;
for (re int i = 0;i <= n + 1;i++){
for (re int j = 0;j <= n + 1;j++) st[i][j] = true;
}
for (re int i = n;i;i--){
for (re int j = i;j <= n;j++) st[i][j] = st[i + 1][j - 1] & (s[i] == s[j]);
}
for (re int j = 1;j <= n;j++){
for (re int i = j;i;i--) f[i][j] = f[i + 1][j] + st[i][j];
}
for (re int i = 1;i <= n;i++){
for (re int j = i;j <= n;j++) dp[i][j] = dp[i][j - 1] + f[i][j];
}
while (q--){
int l,r;
cin >> l >> r;
cout << dp[l][r] << "\n";
}
return 0;
}
作者:WaterSun
出处:https://www.cnblogs.com/WaterSun/p/18263298
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】