D. Palindromic characteristics
time limit per test
3 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Palindromic characteristics of string s with length |s| is a sequence of |s| integers, where k-th number is the total number of non-empty substrings of s which are k-palindromes.

A string is 1-palindrome if and only if it reads the same backward as forward.

A string is k-palindrome (k > 1) if and only if:

  1. Its left half equals to its right half.
  2. Its left and right halfs are non-empty (k - 1)-palindromes.

The left half of string t is its prefix of length ⌊|t| / 2⌋, and right half — the suffix of the same length. ⌊|t| / 2⌋ denotes the length of string t divided by 2, rounded down.

Note that each substring is counted as many times as it appears in the string. For example, in the string "aaa" the substring "a" appears 3 times.

Input

The first line contains the string s (1 ≤ |s| ≤ 5000) consisting of lowercase English letters.

Output

Print |s| integers — palindromic characteristics of string s.

Examples
Input
abba
Output
6 1 0 0 
Input
abacaba
Output
12 4 1 0 0 0 0 
Note

In the first example 1-palindromes are substring «a», «b», «b», «a», «bb», «abba», the substring «bb» is 2-palindrome. There are no 3- and 4-palindromes here.

题意:给你一个字符串 问1~len阶的子串的个数   一个回文串可以称为一阶子串  k阶子串的左右两边为k-1阶子串

题解:dp[i][j]表示原字符串中i~j为dp[i][j]阶

 1 #pragma comment(linker, "/STACK:102400000,102400000")
 2 #include <bits/stdc++.h>
 3 #include <cstdlib>
 4 #include <cstdio>
 5 #include <iostream>
 6 #include <cstdlib>
 7 #include <cstring>
 8 #include <algorithm>
 9 #include <cmath>
10 #include <cctype>
11 #include <map>
12 #include <set>
13 #include <queue>
14 #include <bitset>
15 #include <string>
16 #include <complex>
17 #define ll __int64
18 #define mod 1000000007
19 using namespace std;
20 char s[5003];
21 int re[5003];
22 int dp[5003][5003];
23 int main()
24 {
25     scanf("%s",s+1);
26     int len=strlen(s+1);
27     for(int i=1;i<=len;i++){
28         dp[i][i]=1;
29         re[1]++;
30         if(i!=len&&s[i]==s[i+1]){
31             dp[i][i+1]=2;
32             re[1]++;
33             re[2]++;
34             }
35     }
36     for(int i=3;i<=len;i++)//枚举字串的长度
37     for(int j=1;j+i-1<=len;j++){
38         if(dp[j+1][j+i-2]&&s[j]==s[i+j-1]){
39             dp[j][j+i-1]=dp[j][j+i/2-1]+1;
40             for(int k=1;k<=dp[j][i+j-1];k++) re[k]++;
41         }
42     }
43     for(int i=1;i<=len;i++)
44         printf("%d ",re[i]);
45     return 0;
46 }