題目鏈接:http://codeforces.com/problemset/problem/835/D點擊打開鏈接
- Its left half equals to its right half.這個東西我總是理解成左右得相等。。
#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] <<" ";
}