题目链接:http://codeforces.com/problemset/problem/835/D点击打开链接
- Its left half equals to its right half.这个东西我总是理解成左右得相等。。
主要的想法就是从低阶往高阶dp
dp【i】【j】为s【i~j】最高阶回文串
然后外层枚举串长度
内层从左到右
判定是否成立 注意判定子条件是ij必须相差2以上
#include <bits/stdc++.h>
using namespace std;
int dp[5555][5555];
int main()
{
string s;
cin >> s;
int len=s.length();
int ans[len+1];
for(int i=0;i<=len;i++)
ans[i]=0;
for(int i=0;i<len;i++)
{
dp[i][i]=1;
ans[1]++;
}
for(int j=2;j<=len;j++)
for(int i=0;i+j-1<=len;i++)
{
int r=i+j-1;
if((dp[i+1][r-1]==0&&i+1<=r-1)||s[i]!=s[r])
dp[i][r]=0;
else
dp[i][r]=dp[i][i+j/2-1]+1;
if(dp[i][r])
ans[dp[i][r]]++;
}
for(int i=len-1;i>=1;i--)
ans[i]+=ans[i+1];
for(int i=1;i<=len;i++)
cout << ans[i] <<" ";
}