例题传送门

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

之前学的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. Oracle EBS 配置文件取值

    SELECT op.profile_option_id, tl.profile_option_name, tl.user_profile_option_name, lv.level_id, lv.文件 ...

  2. [SQL SERVER] 映射网络驱动器,让SQL服务器可见

    在服务器上运行: EXEC sp_configure 'show advanced options', 1; GO RECONFIGURE; GO EXEC sp_configure 'xp_cmds ...

  3. leetcode 刷题

    176:第二高的薪水 offset ) as secondhighestsalary; ---去掉第一个,再从第一个开始 177:第N高的薪水 ------相关子查询:子查询中引用了外层查询所引用表的 ...

  4. Hadoop HBase概念学习系列之hbase shell中执行java方法(高手必备)(二十五)

    hbase shell中执行java方法(高手必备),务必掌握! 1. 2. 3. 4. 更多命令,见scan help.在实际工作中,多用这个!!! API参考: http://hbase.apac ...

  5. Spring中手动增加配置文件中占位符引用的变量

    在项目中遇到一个这样的需求,项目的配置文件由外部传入,这时spring配置文件那些占位符变量该如何取值呢? 解决这个问题的做法有几种,我想到的大概有以下三种: 1.通过系统属性来实现,把外部传入的配置 ...

  6. 【cs231n】图像分类-Linear Classification线性分类

    [学习自CS231n课程] 转载请注明出处:http://www.cnblogs.com/GraceSkyer/p/8824876.html 之前介绍了图像分类问题.图像分类的任务,就是从已有的固定分 ...

  7. BZOJ 3171 循环格 最小费用流

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3171 题目大意: 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子.每个元 ...

  8. python第十五课——全局变量and局部变量

    全局变量&局部变量: 全局变量的特点: 1).直接定义在.py文件中(函数外)的变量(全局位置) 2).作用域比较大,可以被此文件中的任何函数所使用 局部变量的特点:1).定义在函数内部(函数 ...

  9. programming-languages学习笔记--第10部分

    programming-languages学习笔记–第10部分 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.sr ...

  10. JAVA构造MAP并初始化MAP

    第一种方法:static块初始化 public class Demo{ private static final Map<String, String> myMap; static { m ...