BZOJ 2160 拉拉队排练
来源:互联网 发布:php开源视频网站系统 编辑:程序博客网 时间:2024/04/29 16:23
2160: 拉拉队排练
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 832 Solved: 326
[Submit][Status][Discuss]
Description
艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了。拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛。所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训练好拉拉队有多么的重要。拉拉队的选拔工作已经结束,在雨荨和校长的挑选下,n位集优秀的身材、舞技于一体的美女从众多报名的女生中脱颖而出。这些女生将随着篮球队的小伙子们一起,和对手抗衡,为艾利斯顿篮球队加油助威。一个阳光明媚的早晨,雨荨带领拉拉队的队员们开始了排练。n个女生从左到右排成一行,每个人手中都举了一个写有26个小写字母中的某一个的牌子,在比赛的时候挥舞,为小伙子们呐喊、加油。雨荨发现,如果连续的一段女生,有奇数个,并且他们手中的牌子所写的字母,从左到右和从右到左读起来一样,那么这一段女生就被称作和谐小群体。现在雨荨想找出所有和谐小群体,并且按照女生的个数降序排序之后,前K个和谐小群体的女生个数的乘积是多少。由于答案可能很大,雨荨只要你告诉她,答案除以19930726的余数是多少就行了。
Input
输入为标准输入。第一行为两个正整数n和K,代表的东西在题目描述中已经叙述。接下来一行为n个字符,代表从左到右女生拿的牌子上写的字母。
Output
输出为标准输出。输出一个整数,代表题目描述中所写的乘积除以19930726的余数,如果总的和谐小群体个数小于K,输出一个整数-1。
Sample Input
5 3
ababa
ababa
Sample Output
45
【样例说明】
和谐小群体女生所拿牌子上写的字母从左到右按照女生个数降序排序后为ababa, aba, aba, bab, a, a, a, b, b,前三个长度的乘积为。
【样例说明】
和谐小群体女生所拿牌子上写的字母从左到右按照女生个数降序排序后为ababa, aba, aba, bab, a, a, a, b, b,前三个长度的乘积为。
HINT
总共20个测试点,数据范围满足:
Source
【题目分析】
用manacher算法求出每一位的回文半径长度,因为只求奇数长度的串,所以不需要加入特殊字符。O(n)的算法还是非常快的。然后用快速幂统计一下就好了。
【代码】
#include <cstdio>#include <iostream>#include <cstring>#include <string>const int mod=19930726;using namespace std;char s[1000010];int r[1000010];long long n,ans[1000010],maxd=0;long long answer=1,k;long long mul(long long a,long long b){ long long re=1; while (b){ if (b&1) (re*=a)%=mod; (a*=a)%=mod; b/=2; } return re;}inline void manacher(){ int id=0,mx=0; r[0]=1; for (int i=1;i<=n;++i){ if (mx>i) r[i]=min(r[2*id-i],mx-i); else r[i]=1; while (s[i-r[i]]==s[i+r[i]]) r[i]++; if (i+r[i]>mx) mx=i+r[i],id=i; ans[r[i]]++; if (r[i]>maxd) maxd=r[i]; }}long long min(long long a,long long b){ return a>b?b:a; } int main(){ scanf("%lld%lld",&n,&k); scanf("%s",s+1); s[0]='@'; s[n+1]='$'; s[n+2]='\0'; manacher(); for (int i=(n+1)/2;i>=1;--i){ if (ans[i]) { (answer*=mul(i*2-1,min(ans[i],k)))%=mod; k-=min(ans[i],k); ans[i-1]+=ans[i]; ans[i]=0; } if (k<=0) break; } if (k>0) printf("-1\n"); else printf("%lld\n",answer);}
0 0
- BZOJ 2160 拉拉队排练
- BZOJ 2160: 拉拉队排练
- BZOJ 2160: 拉拉队排练
- bzoj 2160 拉拉队排练
- BZOJ 2160: 拉拉队排练 manacher
- BZOJ 2160 拉拉队排练 Manacher + 前缀和
- 【BZOJ 2160】拉拉队排练 回文树
- bzoj 2160: 拉拉队排练 manachar+快速幂
- [BZOJ]2160 拉拉队排练 Manacher+快速幂
- [BZOJ 2160] 拉拉队排练 Manacher+贪心
- HYSBZ 2160 拉拉队排练
- 2160: 拉拉队排练
- 回文树——BZOJ 2160: 拉拉队排练
- bzoj 2160: 拉拉队排练 (manacher+前缀和+快速幂)
- BZOJ 2160 拉拉队排练 (Manacher 序列差分)
- 拉拉队排练
- [BZOJ 2160] 拉拉队排练 (manacher+差分数组+前缀和)
- HYSBZ 2160 拉拉队排练(回文树)
- 关于Emacs终端下的Alt模拟Meta与全局菜单冲突的问题
- 列转行
- iOS网络资源汇总之UI
- 单例模式
- iOS 开灯 调用系统手电筒
- BZOJ 2160 拉拉队排练
- 根据字体多少使UILabel自动调节尺寸
- 揭秘LOGO设计流程!超详细的腾讯云LOGO 改版记录全过程
- 解释 int num = 5;(面试)
- java入门之for、if
- Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用?
- IIS配置网站出现404
- React.js中的表单
- 概率图模型(一):贝叶斯网络