1. 程式人生 > >【CodeForces】835D Palindromic characteristics

【CodeForces】835D Palindromic characteristics

mic rac sed turn splay 問題 display ring one

【算法】區間DP

【題解】涉及回文問題的區間DP都可以用類似的寫法,就是h[i][j]表示i~j是否回文,然後就可以O(1)判斷回文了。

f[i][j]=k表示該字符串是k-th字符串,因為首先要求回文,既然回文那麽左半邊和右半邊就肯定一樣了。

技術分享
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=5010;
int f[maxn][maxn],n,ans[maxn];
char s[maxn];
bool h[maxn][maxn];
int main() { scanf("%s",s+1); n=strlen(s+1); for(int i=1;i<=n;i++){f[i][i]=h[i][i]=h[i][i-1]=1;ans[1]++;} for(int p=2;p<=n;p++){ for(int i=1;i+p-1<=n;i++){ int j=i+p-1; h[i][j]=h[i+1][j-1]&(s[i]==s[j]); f[i][j]=h[i][j]?f[i][(i+j-1
)/2]+1:0; ans[f[i][j]]++; } } for(int i=n;i>=1;i--)ans[i]+=ans[i+1]; for(int i=1;i<=n;i++)printf("%d ",ans[i]); return 0; }
View Code

【CodeForces】835D Palindromic characteristics