codeforces835D

来源:互联网 发布:加工中心编程学徒招聘 编辑:程序博客网 时间:2024/05/29 17:48

题意:

给出一个字符串,问它分别具有多少个k级字符串。


一个回文串叫做1级回文串,一个回文串为k级回文串当且仅当它的左半部分和右半部分相同,且两部分都是(k-1)级回文串。


思路:

很明显的区间dp问题, 有明显的dag关系, 然后就结束.

#include<bits/stdc++.h>using namespace std;const int maxn = 5000 + 5;int dp[maxn][maxn], num[maxn];bool ok[maxn][maxn];char s[maxn];int main(){    scanf("%s", s+1);    int len = strlen(s+1);    for(int i = 1; i <= len; i++)    {        dp[i][i] = 1;        ok[i][i] = 1;    }    num[1] = len;    for(int i = 2; i <= len; i++)    {        for(int j = 1; i+j-1 <= len; j++)        {            if(s[j] == s[i+j-1] )            {                if(j+1 == i+j-1 || ok[j+1][i+j-2])                {                    ok[j][i+j-1] = 1;                    int mid = (j+i+j-1)/2;                    if(i&1)  mid--;                    dp[j][i+j-1] = dp[j][mid]+1;a                }            }        }    }    for(int i = 1; i <= len; i++)    {        for(int j = i+1; j <= len; j++)        {            num[dp[i][j]]++;        }    }    for(int i = len; i >= 1; i--)    {        num[i]+=num[i+1];    }    for(int i = 1; i <= len; i++)    printf("%d ", num[i]);    return 0;}

原创粉丝点击