ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-09-07 17:04:30  阅读:315  来源: 互联网

标签:P1659 include bar int Luogu ans lat law 国家集训队



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

解析

  • 题意简单来说就是找所有回文串,按长度从大到小排序后将前K个长度乘起来
  • 看到回文串问题,由于我太菜了,只会Manacher算法,所以只能用Manacher来做这道题了
  • 注意K的数据范围 1e12,long long !!!
  • 快速幂求结果

Code

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
const int N=1000005;
const int mod=19930726;
int n,t,len,r[2*N];
char la[N],law[2*N];
LL k,sum,ans=1,p[N],bar[N];
void pre_deal()
{
    law[0]='!';
    law[1]='#';
    len=2;
    for(int i=1;i<=n;i++)
    {
        law[len++]=la[i];
        law[len++]='#';
    }
    law[len]='?';
    return;
}
void manacher()
{
    pre_deal();
    int id,mx=0;
    for(int i=1;i<len;i++)
    {
        if(i>=mx) r[i]=1;
        else r[i]=min(r[2*id-i],mx-i);
        while(law[i-r[i]]==law[i+r[i]]) r[i]++;
        if(mx<i+r[i])
        {
            id=i;
            mx=i+r[i];
        }
        if(law[i]!='#') p[++t]=r[i]-1;
    }
    return;
}
LL quick_pow(LL a,LL b)
{
    LL ret=1;
    while(b)
    {
        if(b&1) ret=ret*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ret;
}
int main()
{
    scanf("%d%lld",&n,&k);
    cin>>(la+1);
    manacher();
    LL lat=0;
    for(int i=1;i<=t;i++)
    {
        sum+=p[i]/2+1;
        bar[p[i]]++;
        lat=max(lat,p[i]);
    }
    if(sum<k)
    {
        puts("-1");
        return 0;
    }
    LL num=0;
    while(1)
    {
        if(num+bar[lat]>=k)
        {
            ans=(ans*quick_pow(lat,k-num))%mod;
            break;
        }
        ans=(ans*quick_pow(lat,bar[lat]))%mod;
        num+=bar[lat];
        bar[lat-2]+=bar[lat];
        lat-=2;
    }
    printf("%lld\n",ans);
    return 0;
}

标签:P1659,include,bar,int,Luogu,ans,lat,law,国家集训队
来源: https://www.cnblogs.com/Hawking-llfz/p/11481730.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有