zoukankan      html  css  js  c++  java
  • D. Palindromic characteristics

    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..k阶的回文子串并统计它们的数量。如果一个字符串是一个回文串,则它可以是1阶子串(k阶字符串,要求它的左边和右边都是k-1阶子串)

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #define N 5010
     5 using namespace std;
     6 char s[N];
     7 int dp[N][N],ans[N],n;
     8 int main(){
     9     scanf("%s",s+1);
    10     n=strlen(s+1);
    11     for(int i=1;i<=n;++i)
    12         dp[i][i]=1,ans[1]++;
    13 
    14     for(int len=2;len<=n;++len)
    15         for(int i=1;i+len-1<=n;++i){
    16             int j=i+len-1;
    17             if(s[i]!=s[j]||i+1<=j-1&&dp[i+1][j-1]==0)
    18                 dp[i][j]=0;
    19             else
    20                 dp[i][j]=dp[i][i+len/2-1]+1;
    21             if(dp[i][j])
    22                 ans[dp[i][j]]++;
    23         }
    24     for(int i=n;i>=1;--i)
    25         ans[i]+=ans[i+1];
    26     for(int i=1;i<=n;++i)
    27         printf("%d ",ans[i]);
    28     return 0;
    29 }

     

  • 相关阅读:
    ajax实例2
    分页显示中关于"序号"的问题
    <s:property value=""/> 怎么截取返回值的固定长度的字符串
    py 的 第 13 天
    py 的 第 10 天
    py 的 第 8 天
    py 的 第 9 天
    py 的 第 7 天
    这几日英文大汇
    python第五天
  • 原文地址:https://www.cnblogs.com/zllwxm123/p/7301017.html
Copyright © 2011-2022 走看看