CF245H
Queries for Number of Palindromes
题目描述
给你一个字符串s由小写字母组成,有q组询问,每组询问给你两个数,l和r,问在字符串区间l到r的字串中,包含多少回文串。
输入格式
第1行,给出s,s的长度小于5000
第2行给出
分析
对于每次询问,暴力求解的时间复杂度肯定不行。
注意到字符串的长度不是很大,考虑预处理每一个区间的回文串个数。
设
而对于
for (int i = 1; i <= n; i++){
for (int l = i, r = i; l && r <= n && s[l] == s[r]; l--, r++) f[l][r] ++;
for (int l = i, r = i + 1; l && r <= n && s[l] == s[r]; l--, r++) f[l][r] ++;
}
初始时,
#include <bits/stdc++.h>
using namespace std;
const int N = 5e3 + 5;
int n, q;
int dp[N][N];
char s[N];
signed main(){
scanf("%s", s + 1); n = strlen(s + 1);
for (int i = 1; i <= n; i++){
for (int l = i, r = i; l && r <= n && s[l] == s[r]; l--, r++) dp[l][r] ++;
for (int l = i, r = i + 1; l && r <= n && s[l] == s[r]; l--, r++) dp[l][r] ++;
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
dp[i][j] += dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1];
scanf("%d", &q);
for (int l, r; q--; ){
scanf("%d%d", &l, &r);
printf("%d\n", dp[r][r] - dp[r][l - 1] - dp[l - 1][r] + dp[l - 1][l - 1]);
}
return 0;
}
Written with StackEdit中文版.
好玩,爱玩!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通