BZOJ 2160 拉拉队排练

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是求得以i为回文中心的最长回文子串, 所以假设存在长度为len的回文串, 就必定存在len - 2的回文串, 所以我们用累加的方式记录长度为i的回文串有多少个,然后就取前k个快速幂。

  我们可以使用“滚雪球”的方法,一个位置代表的回文串可以长为p,那么它也可以长为p-2。就是这样。LMY当时怒怼YYR,说这就是O(n)的。YYR呵呵一笑,说你讲吧,讲了就知道了。LMY于是讲了下去,忽然发现……

“快速幂是什么鬼!!!(捂嘴)……我们可以预处理出可能用到的幂值。”

  额。因为快速幂,这个算法是O(nlog n)的。

  关于奇数串。因为题目要求,不用补出'#',即是单倍串。但是,补出'#',变成双倍串也可以。当时WA个不停,最后才发现,manacher里头std::min被我打成了std::max。然后单倍串交上去AC了,但是双倍串卡了特别久。一交上去就RE。

  ZJC问:

“你的pal开双倍了吗?”

  我回答,开了啊。然后继续查错,最后发现……我的pos没有开双倍。

  我A了以后,告诉ZJC。TA呵呵一笑,说LIUWENDING帮他查错,问他开long long没有,他义愤填膺地说print就是%lld,最后发现他开了int……

  嗯。就是这样。来自黑龙江省哈尔滨市某大附中的liuwending(至少BZOJ是这么说的)。

  最后当然改出来了。

  这是单倍串。

 1 /**************************************************************
 2     Problem: 2160
 3     User: Doggu
 4     Language: C++
 5     Result: Accepted
 6     Time:276 ms
 7     Memory:9612 kb
 8 ****************************************************************/
 9  
10 #include<cstdio>
11 #include<cstring>
12 #include<algorithm>
13 const int S = 1000005;
14 const long long MOD=19930726;
15 int n, pal[S], pos[S];
16 long long k;
17 char P[S];
18 long long mpow(long long a,long long b) {
19     long long res;
20     for( res = 1; b; b>>=1, a=a*a%MOD ) if(b&1) res=res*a%MOD;
21     return res;
22 }
23 void manacher() {
24     int lenp = strlen(P), mx = 0, id;
25     for( int i = 1; i < lenp; i++ ) {
26         if(i<=mx) pal[i]=std::min(mx-i+1,pal[2*id-i]);
27         else pal[i]=1;
28         while(P[i-pal[i]]==P[i+pal[i]]) pal[i]++;
29         if(i+pal[i]-1>=mx) {
30             mx=i+pal[i]-1, id=i;
31         }
32         pos[pal[i]*2-1]++;
33     }
34     long long sum = 0, tot = 0, ans = 1;
35     for( int i = lenp; i > 0; i-- ) if(i&1) {
36         sum += pos[i];
37         ans=ans*mpow(i,std::min(sum,k-tot))%MOD;
38         tot += sum;
39         if(tot>k) printf("%lld",ans), std::exit(0);
40     }
41     printf("-1\n");
42 }
43 int main() {
44     scanf("%d%lld%s",&n,&k,P+1);
45     P[0]='$';
46     manacher();
47     return 0;
48 }
49 

  这是双倍串。

 1 /**************************************************************
 2     Problem: 2160
 3     User: Doggu
 4     Language: C++
 5     Result: Accepted
 6     Time:504 ms
 7     Memory:19396 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11 #include <cstring>
12 #include <algorithm>
13 const int S = 1001000;
14 const long long MOD = 19930726;
15 int pal[S*2], pos[S*2];
16 long long k;
17 char s[S], P[S*2];
18 long long mpow(long long a,long long b) {
19     long long res;
20     for( res = 1; b; b>>=1, a=a*a%MOD ) if(b&1) res=res*a%MOD;
21     return res;
22 }
23  
24 void build(char *ss) {
25     int lens = strlen(ss);
26     for( int i = 0; i < lens; i++ ) P[i*2+1]='#', P[i*2+2]=ss[i];
27     P[0]='+';P[lens*2+1]='#';P[lens*2+2]='-';P[lens*2+3]='\0';
28 }
29 void manacher() {
30     int lenp = strlen(P), mx = 0, id;
31     for( int i = 1; i < lenp; i++ ) {
32         if(i<=mx) pal[i]=std::min(mx-i+1,pal[2*id-i]);
33         else pal[i]=1;
34         while(P[i-pal[i]]==P[i+pal[i]]) pal[i]++;
35         if(i+pal[i]-1>mx) {
36             mx=i+pal[i]-1, id=i;
37         }
38     }
39     for( int i = 2; i < lenp; i+=2 ) pos[pal[i]-1]++;
40     long long sum = 0, tot = 0, ans = 1;
41     for( int i = lenp; i > 0; i-=2 ) {
42         sum += pos[i];
43         ans=ans*mpow(i,std::min(sum,k-tot))%MOD;
44         tot += sum;
45         if(tot>k) printf("%lld\n",ans), std::exit(0);
46     }
47     printf("-1\n");
48 }
49 int main() {
50     scanf("%lld%lld%s",&k,&k,s);
51     build(s);
52     manacher();
53     return 0;
54 }
55 

  可以发现,它们大体相似。除了在建串、pos建法和“滚雪球”方法上略有不同外,其余基本相同。但是串长了一倍,时间当然会慢一倍。

转载于:https://www.cnblogs.com/Doggu/p/bzoj2160.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React Native获取设备信息组件

转载 https://www.jianshu.com/p/907b003835dc本文原创首发于公众号&#xff1a;ReactNative开发圈&#xff0c;转载需注明出处。这次介绍的获取移动设备信息的组件名叫&#xff1a;react-native-device-info&#xff0c;兼容IOS和安卓双平台&#xff0c;可以获取设备ID、设备品…

UNIX网络编程——套接字选项(SO_RCVBUF和SO_SNDBUF)

有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项。int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen) int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen)level指定…

【51单片机快速入门指南】4.4.3:Madgwick AHRS 九轴姿态融合获取四元数、欧拉角

目录传感器的方向源码Madgwick_9.cMadgwick_9.h使用方法测试main.c效果STC15F2K60S2 22.1184MHz Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 上位机&#xff1a;Vofa 1.3.10 移植自AHRS —— LOXO&#xff0c;算法作者&#xff1a;SOH Madgwick 传…

关于json格式字符串解析并用mybatis存入数据库

园子里面找了很多关于json解析后存入数据库的方法&#xff0c;不是太乱&#xff0c;就是没有写完&#xff0c;我下面的主题代码多是受下面两位的启发&#xff0c;请按顺序查看 http://www.cnblogs.com/tian830937/p/6364622.html,我沿用了这个例子中的json数据格式&#xff0c;…

【Hibernate3.3复习知识点二】 - 配置hibernate环境(annotations)

配置文件hibernate.cfg.xml中引入&#xff1a;<mapping class"com.bjsxt.hibernate.Teacher"/> <hibernate-configuration><session-factory><!-- Database connection settings --><property name"connection.driver_class"&g…

【51单片机快速入门指南】4.5:I2C 与 TCA6416实现双向 IO 扩展

目录硬知识IO 扩展芯片 TCA6416ATAC6416A 的寄存器IO 输入寄存器IO 输出寄存器IO 反相寄存器IO 方向寄存器TCA6416A 的操作TCA6416A 写数据TCA6416A 读数据TCA6416A 的 IO 输入寄存器硬件布局示例程序TCA6416A.cTCA6416A.h测试程序main.c实验现象普中51-单核-A2 STC89C52 MSP43…

linux/window 下 solr5.1 tomcat7.x 环境搭建即简单功能测试

2019独角兽企业重金招聘Python工程师标准>>> 之所以想使用solr来进行学习&#xff0c;很大一部分原因就是&#xff0c;solr能够在某种程度上提供RESTFUL相关的URL请求连接&#xff0c;可以把它理解为 以搜索引擎为基础的存储服务系统 &#xff0c;由于他的搜索可以是…

【Java基础总结】多线程

1. 实现多线程的两种方式 1 //第一种&#xff1a;继承Thread类&#xff0c;重写run()方法2 class ThreadTest1 extends Thread{3 public void run(){4 String threadName Thread.currentThread().getName();5 for(int i0;i<10;i){6 System…

【51单片机快速入门指南】5:软件SPI

目录硬知识SPI协议简介SPI接口介绍SPI接口连接图SPI数据传输方向SPI传输模式软件SPI程序源码Soft_SPI.cSoft_SPI.h普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 上位机&#xff1a;Vofa 1.3.10 源于软件模拟SPI接口程序代码&…

svn搭建本地服务端

使用VisualSVN Server来完成,下载地址:https://www.visualsvn.com/server/download/ 我安装的版本是3.3.1,安装的时候选择了标准版本&#xff0c;另外一个版本需要付费(日志跟踪、VDFS等功能)更多可以参考https://www.visualsvn.com/server/licensing/安装完成之后&#xff0c;…

【51单片机快速入门指南】5.1:SPI与DS1302时钟芯片

目录硬知识DS1302 简介DS1302 使用控制寄存器日历/时钟寄存器DS1302 的读写时序电路设计示例程序DS1302.cDS1302.h测试程序main.c实验现象普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 摘自《普中 51 单片机开发攻略》…

【格局视野】三色需求与工作层次

三色需求 人们的社会经济生活本身就是一个互相交换&#xff0c;价值传递的循环&#xff0c;但这个循环有一个核心&#xff0c;这个核心就是社会大众的需求&#xff0c;也可以称为市场需求&#xff0c;围绕这个需求产生了层级递进的需求关系。 第一个层次是蓝色需求 是最基础的社…

关于linux-Centos 7下mysql 5.7.9的rpm包的安装方式

环境介绍>>>>>>>>>>>>>>>>>> 操作系统&#xff1a;Centos 7.1 mysql数据库版本&#xff1a;mysql5.7.9 mysql官方网站&#xff1a;http://www.mysql.com 原文地址&#xff1a;http://www.cnblogs.com/5201351/p/4912614…

【51单片机快速入门指南】5.2:SPI读取 12位ADC XPT2046 芯片

目录硬知识ADC 简介分辨率转换误差转换速率ADC 转换原理逐次逼近型 ADC双积分型 ADCXPT2046 芯片介绍参考电压内部参考电压外部参考电压输入工作模式单端工作模式差分工作模式温度测量电池电压测量压力测量数字接口笔中断输出转换周期16 时钟周期转换数字时序15 时钟周期转换数…

flask中 app.run(host='0.0.0.0', port=5000, debug=False) 不能用外网ip访问的解决办法

pycharm 2018开启debug模式和修改host&#xff1a; 在Pycharm 2018中&#xff0c;如果想要开启debug模式和更改端口号&#xff0c;则需要编辑项目配置。直接在app.run中更改是无效的。示例图如下&#xff1a; 将 app.run() 改成 app.run(debugFalse) 保存文件&#xff0c…

开发第一个spring boot应用

为什么80%的码农都做不了架构师&#xff1f;>>> 我们来用spring boot开发一个简单的“hello world”web应用&#xff0c;使用maven构建。开始之前&#xff0c;先检查你的java与maven的版本&#xff0c;看是否是spring boot1.3支持的版本&#xff1a; $ java -versi…

机器学习中规则化和模型选择知识

1 问题 模型选择问题&#xff1a;对于一个学习问题&#xff0c;可以有多种模型选择。比如要拟合一组样本点&#xff0c;可以使用线性回归&#xff0c;也可以用多项式回归。那么使用哪种模型好呢&#xff08;能够在偏差和方差之间达到平衡最优&#xff09;&#xff1f; 还有一类…

【51单片机快速入门指南】5.3:SPI控制晶联讯JLX12864G_08602 LCD屏幕

目录示例程序JLX12864G_08602.cJLX12864G_08602.hJLX12864G_08602_Font.cJLX12864G_08602_Font.h测试程序main.c效果STC12LE5A60S2 12MHz Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 示例程序 stdint.h见【51单片机快速入门指南】1&#xff1a;基础知…

Android二维码之创建

由于微信的推出二维码走进了我们的生活&#xff0c;并且越来越多的人们正在发挥着自己的想象力去使用它&#xff0c;来方便我们的生活&#xff0c;我曾经听说过一个笑话&#xff0c;当我们死后&#xff0c;墓碑上不再有墓志铭&#xff0c;而会出现一个记录你一生信息的二维码&a…

如何开展软件架构之概念架构

如何开展软件架构之概念架构 到目前为止&#xff0c;我们已经完成了需求的分析过程&#xff0c;总结来说&#xff0c;主要的步聚是 一&#xff09;需求结构化&#xff0c; 二&#xff09;分析约束影响 三&#xff09;重点关注质量需求。 那么接下来的阶段则是系统的概念架构了&…