例题传送门

好久没写博客了,写一发。

之前学的Manacher算法拿到模板题找到那最后一个点的错误了,TMD没开long long。

Manachar算法主要是处理字符串中关于回文串的问题的,它可以在 O(n)的时间处理出以字符串中每一个字符为中心的回文串半径,由于将原字符串处理成两倍长度的新串,在每两个字符之间加入一个特定的特殊字符,因此原本长度为偶数的回文串就成了以中间特殊字符为中心的奇数长度的回文串了。
Manacher算法提供了一种巧妙的办法,将长度为奇数的回文串和长度为偶数的回文串一起考虑,具体做法是,在原字符串的每个相邻两个字符中间插入一个分隔符,同时在首尾也要添加一个分隔符,分隔符的要求是不在原串中出现,一般情况下可以用#号。
设f[i]表示以i为中心的最长回文串的半径,如:
string:aba,那么f[2]=2。
那么我们再设一个mx,表示当前推到的最右边界(id+f[id]),初值为0。
再设id表示上一个点。
再看下面这张图:

因为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的更多相关文章

随机推荐

  1. python入门の缩进魔术

    idx=1 sum=0 while idx<=100: sum=idx+sum idx=idx+1 print('sum 100 =', sum) ======================= ...

  2. Excel数据导入PG库,字符串正则表达式

    1.Excel数据导入到PG库的某张表中:先将Excel文件转换为CSV格式,打开SQL Shell(psql),连接数据库(输入server,database,Port,username),然后再执 ...

  3. UML建模中简单消息、同步消息和异步消息

    两种消息在UML图中的表示方法如图: 1.同步方式 两个通信应用服务之间必须要进行同步,两个服务之间必须都是正常运行的.发送程序和接收程序都必须一直处于运行状态,并且随时做好相互通信的准备. 发送程序 ...

  4. 浅析Oracle 12c中Data Guard新特性

    浅析Oracle 12c中Data Guard新特性   写在前面 无论是做Oracle运维的小伙伴还是老伙伴,想必对Oracle数据库的数据级灾备核心技术—Data Guard是再熟悉不过了!这项从 ...

  5. Linux cal命令详解

    cal 显示指定月份的日历 常见命令参数 NAME cal - displays a calendar SYNOPSIS cal [-smjy13] [[[day] month] year] DESC ...

  6. Spring @Autowired注解在非Controller/Service中注入为null

    参考:https://blog.csdn.net/qq_35056292/article/details/78430777 问题出现: 在一个非controller/service类中,我需要注入Co ...

  7. centos7.4 nfs-2.3.2

    http://www.linuxfromscratch.org/blfs/view/svn/basicnet/libtirpc.html 注释:安装环境centos7.4;   安装完软件成后会升级系 ...

  8. (1)抽象类 (2)接口 (3)内部类 (4)Object类

    1.抽象类(重点)1.1 抽象方法的概念 抽象方法就是指不能具体实现的方法,也就是该方法没有方法体,使用abstract关键字修饰如: public abstract void cry(); 1.2 ...

  9. 《关于oracle数据库的勒索病毒的预警》

    近日,接部分机构反馈和安全厂商提醒,针对oracle数据库的勒索病毒攻击数量增加.该病毒存在较长潜伏期,会根据数据库实例创建时间距今是否满足1200天决定是否发起攻击.攻击通过执行恶意SQL脚本,加密 ...

  10. php操作redis的两个个小脚本

    redis这东西,查询起来没有mysql那么方便,只能自己写脚本了.下面是工作中写的两个小脚本 第一个脚本,查找有lottery|的键,将他们全部删除|打印出来 <?php $redis = n ...