zoukankan      html  css  js  c++  java
  • bzoj 2160: 拉拉队排练(manacher)

    2160: 拉拉队排练

    Time Limit: 10 Sec  Memory Limit: 259 MB
    [Submit][Status][Discuss]

    Description

    艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了。拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛。所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训练好拉拉队有多么的重要。拉拉队的选拔工作已经结束,在雨荨和校长的挑选下,n位集优秀的身材、舞技于一体的美女从众多报名的女生中脱颖而出。这些女生将随着篮球队的小伙子们一起,和对手抗衡,为艾利斯顿篮球队加油助威。一个阳光明媚的早晨,雨荨带领拉拉队的队员们开始了排练。n个女生从左到右排成一行,每个人手中都举了一个写有26个小写字母中的某一个的牌子,在比赛的时候挥舞,为小伙子们呐喊、加油。雨荨发现,如果连续的一段女生,有奇数个,并且他们手中的牌子所写的字母,从左到右和从右到左读起来一样,那么这一段女生就被称作和谐小群体。现在雨荨想找出所有和谐小群体,并且按照女生的个数降序排序之后,前K个和谐小群体的女生个数的乘积是多少。由于答案可能很大,雨荨只要你告诉她,答案除以19930726的余数是多少就行了。

    Input

    输入为标准输入。第一行为两个正整数n和K,代表的东西在题目描述中已经叙述。接下来一行为n个字符,代表从左到右女生拿的牌子上写的字母。

    Output

    输出为标准输出。输出一个整数,代表题目描述中所写的乘积除以19930726的余数,如果总的和谐小群体个数小于K,输出一个整数-1。

    Sample Input

    5 3
    ababa

    Sample Output

    45
    【样例说明】
    和谐小群体女生所拿牌子上写的字母从左到右按照女生个数降序排序后为ababa, aba, aba, bab, a, a, a, b, b,前三个长度的乘积为。

    HINT

    总共20个测试点,数据范围满足: 

    要求奇数回文串,所以不用加特殊字符

    manacher 跑一遍

    计算出 最大回文长度为i的字符串有多少个

    然后做一遍后缀和

    即可求出所有长为i的回文字符串

    答案用快速幂统计

    #include<cstdio>
    #include<algorithm>
    
    #define N 1000001
    #define mod 19930726
    
    using namespace std;
    
    typedef long long LL;
    
    char s[N];
    int p[N];
    LL sum[N];
    
    int Pow(LL a,LL b)
    {
        a%=mod; b%=mod;
        LL res=1;
        for(;b;a=a*a%mod,b>>=1)
            if(b&1) res=res*a%mod;
        return res;
    }
    
    int main()
    {
        int n; LL k;
        scanf("%d%lld",&n,&k);
        scanf("%s",s+1);
        int id=0,pos=0,x;
        for(int i=1;i<=n;i++)
        {
            if(pos>i) x=min(p[2*id-i],pos-i);
            else x=1;
            while(i-x && s[i-x]==s[i+x]) x++;
            if(i+x>pos) pos=i+x,id=i;
            p[i]=x;
            sum[x*2-1]++;
        }
        for(int i=n-1;i;i--) sum[i]+=sum[i+1];
        int len=n-(!(n&1)),ans=1;
        while(k)
        {
            while(len>0 && !sum[len]) len-=2;
            if(len<0) break;
            ans=1ll*ans*Pow(len,min(k,sum[len]))%mod;
            k-=min(k,sum[len]);
            len-=2;
        } 
        printf("%d",ans);
    }
  • 相关阅读:
    2017ICPC南宁补题
    H. The Game of Life
    I
    Twice Equation
    (贪心+队列)String
    Marcin and Training Camp
    莫比乌斯函数模版
    HDU-1695 莫比乌斯反演
    Steps to One DP+莫比乌斯反演
    Educational Codeforces Round 62 (Rated for Div. 2)
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/7662876.html
Copyright © 2011-2022 走看看