[题解]CF245H Queries for Number of Palindromes

思路

定义 dpi,j 表示区间 [i,j] 中回文串的数量。那么,不难得出状态转移方程 dpi,j=dpi1+fi,j。(其中 fi,j 表示左端点大于等于 i,右端点为 j 的回文串数量)

由此,现在问题转变为了如何求 fi,j。如果我们在求出了 fi+1,j 情况下,fi,j 就等于 fi+1,j 再加上 sij 是否是回文串。

判断回文串就很好求了,首先定义 sti,j=0/1 表示 sij 不是/是 一个回文串。

然后,固定一个初始的点,然后向外扩展即可。即,对于 si=sj,有 sti,j=sti+1,j1

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 国际」许可协议进行许可。

posted @   WBIKPS  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示