Manacher【p1659】 [国家集训队]拉拉队排练
题目描述
n个女生举牌子(只含有26个小写字母,长度为n的字符串), 如果连续的一段女生,有奇数个,并且她们手中的牌子所写的字母,从左到右和从右到左读起来一样,那么这一段女生就被称作和谐小群体。
现在想找出所有和谐小群体,并且按照女生的个数降序排序之后,前K个和谐小群体的女生个数的乘积是多少。由于答案可能很大,输出除以19930726的余数。
分析
显然,一个和谐小群体是一个长度为奇数的回文串。
理所当然地我们想到了manacher算法
manacher算法可以求出每个位置的回文半径.
所以我们可以用manacher来解决此题
然后因为这个题只需要求出奇数长度的回文串
所以不需要考虑插入字符(其实也可以插入
由于最后一个点十分大 k<10^12(辣么长
所以需要快速幂加速一下
掉坑现场
重点 个人认为
求出了某一位置的回文半径
就像样例解释中一样
eg:a b a b a
回文半径为5
但它也包含了 a bab ababa!
即如果一个值为x(x>1)那x-1,x-2.....也存在
所以我们需要前缀和来做
(感觉不应该叫前缀和啊emm 但又感觉差不多)
我们可以用桶存储一下回文半径,倒着搜一遍即可
(:з」∠) (胳膊没了
----------------代码------------------
一代码部分参考bolg @five20
#include<bits/stdc++.h>
#define IL inline
#define RI register long long
#define N 1000008
#define mod 19930726
char s[N<<1],ch[N];
long long n,k,len,RL[N<<1],mxxnum,sum,ans=1;
long long MaxRight,center,tong[N<<1];
IL long long ksm(long long x,long long y)
{
long long res=1;
for(;y;y>>=1,x=x*x%mod)
if(y&1)res=res*x%mod;
return res;
}
int main()
{
scanf("%lld%lld",&n,&k);
scanf("%s",s+1);
for(RI i=1;i<=n;i++)
{
if(i<=MaxRight)RL[i]=std::min(MaxRight-i,RL[2*center-i]);
else RL[i]=1;
while(i+RL[i]<=n&&i-RL[i]>=0&&s[i+RL[i]]==s[i-RL[i]])++RL[i];
if(i+RL[i]-1>MaxRight)MaxRight=i+RL[i]-1,center=i;
tong[2*RL[i]-1]++;
}
//for(RI i=1;i<=n;i++)printf("%lld ",tong[i]);
if(n%2!=1)n--;
for(RI i=n;i>=1;i-=2)
{
sum+=tong[i];
if(sum>k)
{
ans=ans*ksm(i,k)%mod;
break;
}
else
{
ans=ans*ksm(i,sum)%mod;
k-=sum;
}
}
if(sum<k)printf("-1");
else printf("%lld\n",ans);
}
好了好了 我知道丑了emmmm
Manacher【p1659】 [国家集训队]拉拉队排练的更多相关文章
- 洛谷 P1659 [国家集训队]拉拉队排练(Manacher)
题目链接:https://www.luogu.com.cn/problem/P1659 思路: 首先跑一遍Manacher,用$cnt_i$记录长为$i$的回文串有多少个. 所记录的$cnt$并不是最 ...
- luogu P1659 [国家集训队]拉拉队排练
唔....话说好久没有发布题解了(手痒痒了 首先特别鸣谢lykkk大佬今天下午教我Manacher算法,甚是感谢 为了体现学习成果,写一篇蒟蒻版的题解(大佬勿喷 言归正传 题面——>在这儿 首先 ...
- P1659 [国家集训队]拉拉队排练
思路 求出cnt和len之后,直接乘起来即可 代码 #include <cstdio> #include <algorithm> #include <cstring> ...
- 【洛谷 P1659】 [国家集训队]拉拉队排练(manacher)
题目链接 马拉车+简单膜你 #include <cstdio> #include <cstring> #include <algorithm> using name ...
- [国家集训队] 拉拉队排练 - Manacher
用 Manacher 跑出回文串长,注意这里不需要偶数长度所以不需要对串做一些奇怪的处理 然后用前缀和搞一下,计算答案时跑快速幂即可 #include <bits/stdc++.h> us ...
- 题解 P1659 【[国家集训队]拉拉队排练】
一眼可得PAM 如果没学过PAM的可以看这里:PAM学习小结 我们令PAM上多记录一个信息\(sum\),表示该节点表示串在原串上出现了多少次. 当我们处理完了\(sum\),对于长度\(len\)为 ...
- [回文树][BZOJ2160][国家集训队]拉拉队排练
题面 Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮 ...
- [国家集训队]拉拉队排练 Manancher_前缀和_快速幂
Code: #include <cstdio> #include <algorithm> #include <cstring> using namespace st ...
- Manacher || P4555 [国家集训队]最长双回文串 || BZOJ 2565: 最长双回文串
题面:P4555 [国家集训队]最长双回文串 题解:就.就考察马拉车的理解 在原始马拉车的基础上多维护个P[i].Q[i]数组,分别表示以i结尾最长回文子串的长度和以i开头的最长回文子串的长度 然后就 ...
随机推荐
- shell脚本批量下载资源并保留路径
示例资源列表 如url.txt: http://su.bdimg.com/static/superplus/img/logo_white_ee663702.png http://su.bdimg.co ...
- linux下多线程断点下载工具-axel
今天要下载一下14G左右的文件,用wget约10小时,后来发现linux下有个多线程支持断点续传的下载工具axel,试了一下,下载速度大大增加. 包地址:http://pkgs.repoforge.o ...
- 在cmd运行脚本
1.打开cmd 2.cd到脚本目录,运行所有脚本的上级目录,我的是cd C:\Users\Administrator\PycharmProjects\webtest\TestSuit 3.使用Pyth ...
- python3知识点之---------字符串的介绍
1. 定义 其实字符串就是一系列字符,用引号括起来的就是字符串,其中的引号可以是单引号或者双引号. 比如 "This is a string" 'This is a strin ...
- 【Python】print 方法的参数
当在IDEL或者命令行中执行 help(print) 命令时,就可以看到 print 方法的详细说明: print(value, ..., sep=' ', end='\n', file=sys.st ...
- 在python中如何比较两个float类型的数据是否相等
奇怪的现象 前几天跟同事聊起来,在计算机内部float比较是很坑爹的事情.比方说,0.1+0.2得到的结果竟然不是0.3? >>> 0.1+0.2 0.300000000000000 ...
- Struts2+DAO层实现实例02——搭建DAO基本框架并与Struts2组合
实例内容 创建DAO(Data Access Oject)接口:BaseDAO 创建其实例化类:UserDAO 用于获取数据库struts中的userinfo表中的内容 创建User的Java Bea ...
- 简单的JS钟表计时
思路:先写出简单的数字计时,根据时分秒的数值转换成度数,使用CSS3的transform进行div倾斜. 知识点:transform可以对div进行倾斜或旋转等效果.但是根据浏览器不同代码也不同,本代 ...
- 【距离GDOI:128天】【POJ2778】DNA Sequence(AC自动机+矩阵加速)
已经128天了?怎么觉得上次倒计时150天的日子还很近啊 ....好吧为了把AC自动机搞透我也是蛮拼的..把1030和这道题对比了无数遍...最终结论是...无视时间复杂度,1030可以用这种写法解. ...
- Codeforces Round #359 (Div. 2) C
C. Robbers' watch time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...