可以DP,也可以暴力判这个串是不是1,2,3….-回文串,判回文可以hash,也可以预处理判长度
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 5005;
char s[N];
int n;
int ma[N], mb[N];
int init_Odd(int x){
int ans = 0;
for(int i=x-1, j=x+1;i>=1 && j<=n;i--, j++)
if(s[i] == s[j]) ++ans;
else break;
return ans;
}
int init_Even(int x){
int ans = 0;
for(int i=x, j=x+1;i>=1 && j<=n;i--, j++)
if(s[i] == s[j]) ++ans;
else break;
return ans;
}
bool ispal(int i, int j){
int len = j - i + 1;
if(len & 1) return ma[(i+j) >> 1] >= (len>>1);
return mb[(i+j) >> 1] >= (len>>1);
}
int c[N];
void solve(int Left, int Right, int dep){
if(Left > Right || !ispal(Left, Right)) return;
++c[dep];
int len = (Right - Left + 1)>>1;
solve(Left, Left + len - 1, dep+1);
}
int main(){
scanf("%s", s+1);
n = strlen(s + 1);
for(int i=1;i<=n;i++) ma[i] = init_Odd(i);
for(int i=1;i<=n;i++) mb[i] = init_Even(i);
for(int i=1;i <= n;i++)
for(int j=i;j <= n;j++)
solve(i, j, 1);
for(int i=1;i<=n;i++)
printf("%d ",c[i]);
return 0;
}