~ManancherQwQ
好久没写博客了,写一发。
之前学的Manacher算法拿到模板题找到那最后一个点的错误了,TMD没开long long。
Manachar算法主要是处理字符串中关于回文串的问题的,它可以在 O(n)的时间处理出以字符串中每一个字符为中心的回文串半径,由于将原字符串处理成两倍长度的新串,在每两个字符之间加入一个特定的特殊字符,因此原本长度为偶数的回文串就成了以中间特殊字符为中心的奇数长度的回文串了。Manacher算法提供了一种巧妙的办法,将长度为奇数的回文串和长度为偶数的回文串一起考虑,具体做法是,在原字符串的每个相邻两个字符中间插入一个分隔符,同时在首尾也要添加一个分隔符,分隔符的要求是不在原串中出现,一般情况下可以用#号。
因为mx=f[id]+id,所以设j为i的对称点,i点的f值为min(f[id*2-i(j)],mx-i),可以理解为i~mx和f[j]的最小值,因为在-mx~mx之间以id对称。
在看例题,先求出f数组,用前缀和求出啦啦队的长度的数量,用快速幂统计。
code:
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
using namespace std; long long N,K;
string S; const long long MOD=; long long pow(long long x,long long k)
{
long long res=;
while(k){
if(k&)res=res*x%MOD;
x=x*x%MOD;
k>>=;
}
return res;
} string Ne;
int f[];
int sum[];
void Manacher()
{
Ne+="?!";
for(int i=;i<S.size();i++)
Ne+=S[i],Ne+='!';
Ne+='~';
int mx=,id=;
for(int i=;i<Ne.size()-;i++){
f[i]=i<=mx?min(f[id*-i],mx-i):;
while(Ne[i-f[i]]==Ne[i+f[i]])
f[i]++;
if(mx<i+f[i]){
id=i;
mx=i+f[i];
}
}
for(int i=;i<Ne.size()-;i++)
if(Ne[i]!='!')sum[f[i]-]++;
for(int i=N;i>;i--)
sum[i]+=sum[i+];
return ;
} int main()
{
cin>>N>>K>>S;
Manacher();
long long ans=;
for(int i=N;i>;i--){
if(K<=)break;
if(sum[i]){
if(K>sum[i])ans=(ans*pow(i,sum[i]))%MOD;
else ans=(ans*pow(i,K))%MOD;
K-=sum[i];
}
}
printf("%lld",ans);
return ;
}
~ManancherQwQ的更多相关文章
随机推荐
- XML与DataSet的相互转换的类
一.XML与DataSet的相互转换的类 using System; using System.Collections.Generic; using System.Text; using System ...
- 安装Linux Centos系统硬盘分区方法
一.硬盘回顾 无论是安装Windows还是Linux操作系统,硬盘分区都是整个系统安装过程中最为棘手的环节.硬盘一般分为IDE硬盘.SCSI硬盘和SATA硬盘三种,在Linux系统中,IDE接口的硬盘 ...
- 转:java 委托
委托模式是软件设计模式中的一项基本技巧.在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理.委托模式是一项基本技巧,许多其他的模式,如状态模式.策略模式.访问者模式 ...
- 转:eclipse的快捷键
22 21 Eclipse中10个最有用的快捷键组合 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到 ...
- 工具类-vim在shell中卡死的情况
time:2015/11/35 在xshell下面使用vim编辑,有时候会出现突然卡死的情况.但是如果重新开一个终端的话,打开文件又是一大堆问题,今天又碰到了,搜了一下就找到一个帮助了[1] 原因:按 ...
- 开源作业调度框架 - Quartz.NET - 实战使用1
简介: 第一步:下载Quartz.NET 下载Quartz.NET只需要打开网址选择适宜的版本进行下载解压缩即可. 目前最新版本是2.3.3,压缩包为6MB,不过鉴于国内网速.我还是加一下博客园的下载 ...
- November 29th 2016 Week 49th Tuesday
It is not easy to meet each other in such a big world. 世界这么大,能遇见,不容易. To meet each other, to make ne ...
- Python的网络编程 Socket编程
Socket是进程间通信的一种方式,与其他进程间通信的一个主要不同是:能实现不同主机间的进程间通信,网络上各种各样的服务大多都是基于Socket来完成通信的,要解决网络上两台主机间的通信问题,首先要唯 ...
- python第十八课——常用内置函数
常用内置函数:round(): print(round(3.14),round(3.99)) print(round(3145.926,-2),round(413.575,2)) abs(): pri ...
- 20165318 2017-2018-2 《Java程序设计》第二周学习总结
20165318 2017-2018-2 <Java程序设计>第二周学习总结 教材学习内容总结 本周学习了第二章和第三章的内容,掌握了Java中基本数据类型.数组.运算符.表达式和语句等方 ...