Manacher【p1659】 [国家集训队]拉拉队排练
2024-10-19 11:49:53
题目描述
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
最新文章
- js 上传文件模拟Form 表单
- Linux下的文件及文件后缀名
- 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)【转】
- FZU2150 Fire Game BFS搜索
- DevExpress 控件 GridControl常见用法
- hdu1569find the safest road(floyd变形求最大安全值)
- js中内置有对象
- [项目记录] 用c语言完成的一个学生成绩管理系统
- 微软的一篇ctr预估的论文:Web-Scale Bayesian Click-Through Rate Prediction for Sponsored Search Advertising in Microsoft’s Bing Search Engine。
- Linux 环境下一些常用命令(四)
- SCRUM 12.20
- 用Physijs在场景中添加物理效果
- 抓取awr、语句级awr、ashrpt
- Druid介绍2
- 一:理解ASP.NET的运行机制(例:通过HttpModule来计算页面执行时间)
- 菜鸟学EJB(一)——第一个实例
- spring cloud图形化dashboard是如何实现指标的收集展示的
- Passing the Message 单调栈两次
- ArrayList底层实现
- Ionic Js十:加载动作
热门文章
- shell监控脚本
- Python3.7在win10下安装PyAudio库以及实现音频的录制与播放
- install.cloudinit.qga.bat
- Linq 聚合函数
- 以太坊源码分析(52)以太坊fast sync算法
- 【BZOJ 5000 OI树】
- [解决方案]NuGet打包报错: &#39;X&#39; already has a dependency defined for &#39;Y&#39;
- Codeforces:Good Bye 2018(题解)
- String中的“equal方法”和“==”
- svn merge详解