zoukankan      html  css  js  c++  java
  • Codeforces Round #427 (Div. 2) D. Palindromic characteristics(Manacher求回文串)

    题目链接:Codeforces Round #427 (Div. 2) D. Palindromic characteristics

    题意:

    给你一个串,定义k-th回文串,让你求每个k-th的数量。

    题解:

    manacher处理好后做一下dp就行了。

    当然也可以直接dp不用manacher.

     1 #include<bits/stdc++.h>
     2 #define F(i,a,b) for(int i=a;i<=b;++i)
     3 using namespace std;
     4 
     5 const int N=5000+7;
     6 
     7 char s[N];
     8 int ans[N],n;
     9 struct Manacher{
    10     char str[N<<1];
    11     int p[N<<1],len,mx,id,tl,ans,i;
    12     int maxlen(char *s){
    13         len=strlen(s),mx=0,id=0,tl=0,str[tl++]='$',str[tl++]='#';
    14         for(i=0;i<len;i++)str[tl++]=s[i],str[tl++]='#';
    15         for(i=2,str[tl]=0,ans=0;i<tl;i++){
    16             p[i]=mx>i?min(p[(id<<1)-i],mx-i):1;
    17             while(str[i-p[i]]==str[i+p[i]])p[i]++;
    18             if(i+p[i]>mx)mx=i+p[i],id=i;
    19             if(ans<p[i])ans=p[i];
    20         }
    21         return ans-1;
    22     }
    23 }M;
    24 
    25 int is[N][N];
    26 
    27 int main()
    28 {
    29     scanf("%s",s);
    30     M.maxlen(s);
    31     F(i,1,M.len)is[i][i]=1;
    32     ans[1]=M.len;
    33     F(i,1,M.len*2)
    34     {
    35         if(M.p[i]<2)continue;
    36         int R;
    37         R=M.p[i]/2;
    38         if(M.str[i]!='#')
    39         {
    40             int idx=i/2;
    41             for(int j=R-1;j>=1;j--)
    42             {
    43                 int l=idx-j,r=idx-1; 
    44                 is[l][idx+j]=is[l][r]+1;
    45                 ans[is[l][idx+j]]++;
    46             }
    47         }else
    48         {
    49             int idx=i/2;
    50             for(int j=R;j>=1;j--)
    51             {
    52                 int l=idx-j+1,r=idx;
    53                 is[l][idx+j]=is[l][r]+1;
    54                 ans[is[l][idx+j]]++;
    55             }
    56         }
    57     }
    58     for(int i=M.len-1;i;i--)ans[i]+=ans[i+1];
    59     F(i,1,M.len)printf("%d%c",ans[i]," 
    "[i==M.len]);
    60     return 0;
    61 }
    View Code
  • 相关阅读:
    【Django】django 处理request流程细节(转)
    【Django】request 处理流程(转)
    【Django】中间件
    【HTML】DocType
    【CSS】伪类与伪元素
    【nodejs】nodejs 的linux安装(转)
    【chrome】 chrome 开发者工具
    【samba】samba 用户权限配置(转)
    form表单组件
    自定义分页器
  • 原文地址:https://www.cnblogs.com/bin-gege/p/7271587.html
Copyright © 2011-2022 走看看