zoukankan      html  css  js  c++  java
  • BZOJ 2160 拉拉队排练

    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算出每个点最长回文串2*len[i]-1

    那么显然[1,2*len[i]-1]的所有奇数也都是和谐团队

    于是将最长的回文长度塞入一个桶

    从大到小维护前缀和,一旦大于k就退出,计算乘积用快速幂

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cmath>
     5 #include<cstring>
     6 using namespace std;
     7 typedef long long lol;
     8 lol n,k,Mod=19930726,t[2000001],ans;
     9 lol len[2000001];
    10 char s[2000001];
    11 lol qpow(lol x,lol y)
    12 {
    13   lol res=1;
    14   while (y)
    15     {
    16       if (y&1) res=res*x%Mod;
    17       x=x*x%Mod;
    18       y>>=1;
    19     }
    20   return res;
    21 }
    22 int main()
    23 {lol i;
    24   cin>>n>>k;
    25   scanf("%s",s+1);
    26   n=strlen(s+1);
    27   lol po=0,mx=0;
    28   for (i=1;i<=n;i++)
    29     {
    30       if (i<mx) len[i]=min(mx-i,len[2*po-i]);
    31       else len[i]=1;
    32       while (i+len[i]<=n&&i-len[i]>=1&&s[i-len[i]]==s[i+len[i]]) len[i]++;
    33       if (i+len[i]>mx)
    34     {
    35       po=i;
    36       mx=i+len[i];
    37     }
    38       t[2*len[i]-1]++;
    39     }
    40   lol cnt=0;
    41   ans=1;
    42   for (i=n;i>=1;i--)
    43     if ((i&1))
    44       {
    45     cnt+=t[i];
    46     if (cnt>k)
    47       {
    48         ans=(ans*qpow(i,k))%Mod;
    49         break;
    50       }
    51     else
    52       {
    53         ans=(ans*qpow(i,cnt))%Mod;
    54         k-=cnt;
    55       }
    56       }
    57   if (cnt<k)
    58     cout<<-1;
    59   else cout<<ans;
    60 }
  • 相关阅读:
    shiro cookie登录根据角色跳转不同页面的解决方案
    springboot 引入shiro缓存及rememberMe支持
    android开发记录2 webview调用二维码扫描
    android app开发记录1
    bootstrap datetimepicker 出现选中后没有日期的原因
    mybatis-plus @Select select in 查询实现
    Mybatis-Plus 中的 @Select 出现查询不到数据的原因
    caffe Python API 之InnerProduct
    caffe Python API 之LRN
    caffe Python API 之Dropout
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/8383761.html
Copyright © 2011-2022 走看看