[国家集训队]拉拉队排练

题述《https://www.luogu.org/fe/problem/P1659

#include<stdio.h>
char s[1000057],vs[1000057];
int p[1000057];long long amoup[2000057],mp,tmp;
int main()
{
   int n,K;
   int ci,rei=0;
   long long pmp,ptmp,pres;
   long long res=1;
   int i,j,k;
   scanf("%d %d %s",&n,&K,s);
   vs[0]='!';
   j=0;
   for(i=1;i<n+1;++i)
      vs[i]=s[i-1];
   vs[i]='\n';
   for(i=1;i<n+1;++i)
   {
      if(i<rei)
         p[i]=p[2*ci-i]>rei-i?rei-i:p[2*ci-i];
      else
         p[i]=1;
      while(vs[i-p[i]]==vs[i+p[i]])
         ++p[i];
      ++amoup[p[i]*2-1];
      if(mp<p[i]*2-1)
         mp=p[i]*2-1;
      if(rei<i+p[i]-1)
      {
         ci=i;
         rei=i+p[i]-1;
      }
   }
   for(i=mp-2;i>0;i-=2)
      amoup[i]+=amoup[i+2];
   while(mp>0&&K)
   {
      tmp=amoup[mp]<K+1?amoup[mp]:K;
      pmp=mp;ptmp=tmp%19930726;
      pres=1;
      while(ptmp)
      {
         if((ptmp&1)!=0)
            pres=pres*pmp%19930726;
         ptmp>>=1;
         pmp=pmp*pmp%19930726;
      }
      res=res*pres%19930726;
      mp-=2;
      K-=tmp;
   }
   if(K)
      printf("-1");
   else
      printf("%lld",res);
   return 0;
}

 行36一个和谐小群体女生的人数mp必须>0。

算法《https://wswmsword.github.io/2019/04/26/manacher/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值