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:
- Its left half equals to its right half.
- 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.
The first line contains the string s (1 ≤ |s| ≤ 5000) consisting of lowercase English letters.
Print |s| integers — palindromic characteristics of string s.
abba
6 1 0 0
abacaba
12 4 1 0 0 0 0
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 }