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 传…

室内定位 - 资料收集

微信小程序API——获取定位 微信小程序定位权限开启或关闭怎么控制 小蜜引路&#xff1a;室内定位导航微信小程序 自己动手 IBeacon 室内定位 完整体验&#xff08;超详细过程&#xff09; 10种室内定位技术原理深度解析

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

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

网络软件的组成

在计算机网络系统中&#xff0c;除了各种网络硬件设备外&#xff0c;还必须具有网络软件 1、网络操作系统 网络操作系统是网络软件中最主要的软件,用于实现不同主机之间的用户通信&#xff0c;以及全网硬件和软件资源的共享&#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…

室内定位 -- 资料收集

室内定位系列&#xff08;一&#xff09;——WiFi位置指纹&#xff08;译&#xff09;

【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…

C++类分号(;)问题

环境&#xff1a;vs2010 问题&#xff1a;今天编代码过程中发现好多很奇怪的错误&#xff0c;我以为昨天调了下编译器才出问题了。搞了好久&#xff0c;代码注释掉很多还是不行,并且错误还一直在变化。问题大概如下&#xff1a; &#xff08;照片上传不了&#xff09; 1.error …

PHP远程连接MYSQL数据库非常慢的解决方法

不知道如何解决&#xff0c;所以把他空间所在的服务器上也装了个MYSQL,才解决问题&#xff0c;今天又有个这个问题&#xff0c;不能也在这服务器上装一个MYSQL吧&#xff0c;Search: PHP远程连接MYSQL速度慢,有时远程连接到MYSQL用时4-20秒不等,本地连接MYSQL正常,出现这种问题…

【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;…

hdu 4612 边连通度缩点+树的最长路径

思路&#xff1a;将以桥为分界的所有连通分支进行缩点&#xff0c;得到一颗树&#xff0c;求出树的直径。再用树上的点减去直径&#xff0c;再减一 #pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #incl…

c++ primer 4.4节练习答案

练习4.13 a) d3.0, i3 b) i3, d3.5 练习4.14 第一个&#xff1a;非法&#xff0c;42是一个右值&#xff0c;右值不能当做左值使用 第二个&#xff1a;返回值总为真 练习4.15 pi是指针类型&#xff0c;不可将int类型指针赋值给int型&#xff0c;可做如下修改 dval ival 0; pi …

详解Ubuntu Server下启动/停止/重启MySQL数据库的三种方式(ubuntu 16.04)

启动mysql&#xff1a; 方式一&#xff1a;sudo /etc/init.d/mysql start 方式二&#xff1a;sudo service mysql start 停止mysql&#xff1a; 方式一&#xff1a;sudo /etc/init.d/mysql stop 方式二&#xff1a;sudo service mysql stop 重启mysql&#xff1a; 方式一…

【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 单片机开发攻略》…

006_Select.sql查询语句

--创建一个部门表 CREATE TABLE tb2_dapt(DEPTNO INT PRIMARY KEY, --部门编号DNAME VARCHAR(20) NOT NULL, --部门名称LOC VARCHAR(20) NOT NULL --部门地址 ) --插入数据 INSERT INTO tb2_dapt (DEPTNO, DNAME, LOC) VALUES(10,财务部,北京); INSERT INTO tb2_dapt (DEPTN…