Palindromic characteristics
题意:
给你一个字符串,求出它的k阶回文子串有多少。k阶回文子串的定义,它本身是回文串,左半部分和右半部分相等,且都是k-1阶回文子串。
思路:
dp[i][j]表示字符s[i...j]最大是几阶,当si ! = sj 或 dp[i+1][j-1]=0 时它不是回文串。否则 dp[i][j] = dp[i][i+len/2-1] + 1 (左边的k-1阶) 。
如果它是k阶那么它一定是k-1阶。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=5e3+5;
char s[N];
int dp[N][N],ans[N];
int main(){
scanf("%s",s+1);
int n=strlen(s+1);
for(int i=1;i<=n;i++)
dp[i][i]=1,ans[1]++;
for(int len=2;len<=n;++len){
for(int i=1;i+len-1<=n;++i){
int j=i+len-1;
if(s[i]!=s[j]||(i+1<=j-1&&dp[i+1][j-1]==0))
dp[i][j]=0;
else dp[i][j]=dp[i][i+len/2-1]+1;
ans[dp[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;
}