例题传送门

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

之前学的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. c基础_笔记_1

    定义变量 int i; 也可以 int i,num; 赋值,c必须先定义变量再赋值 num = 0; 循环for for(i=1; i<=0; i++) { printf("%d \n ...

  2. 导出AD用户所属组,查询AD用户(aduser)

    $ous="admin","bladmin","af","dd"for($i=0;$i -lt 2;$i++) { $o ...

  3. Python(二)列表的增删改查

    一,列表的增删改查 列表中增加元素: 1,从列表的末尾增加一个元素:append("") 2,从列表中插入一个元素:insert(下标位置,插入的元素) 合并列表: 1,name. ...

  4. Top 25 Most Frequently Asked Interview Core Java Interview Questions And Answers

    We are sharing 25 java interview questions , these questions are frequently asked by the recruiters. ...

  5. 铁乐学python_day13_迭代器生成器

    一.[可迭代对象Iterable] 粗略判断的话,我们可以说能被for循环进行遍历的对象就是可迭代对象,如str,list,tuple,dict(key),set,range. (open file ...

  6. saltstack-把执行结果存储到mysql服务内

    saltstack把执行的结果保存到mysql中,以便进行命令安全审计 mysql负责存储数据,mysql-python负责收集数据 master需要安装mysql和MySQL-python,mini ...

  7. 一、BOM 二、DOM

    一.BOM(window对象)###<1>window属性对象 window.location 当前浏览器的地址对象 window.history 浏览器访问过的地址对象 window.o ...

  8. September 21st 2017 Week 38th Thursday

    What fire does not destroy, it hardens. 烈火摧毁不了的东西,只会变得更坚固. The true gold can stand the test of fire, ...

  9. 用windows自带的fsutil修改稀疏文件大小成功,但文件内容似乎丢失

    fsutil sparse setflag. fsutil sparse setrange 10M对应字节,1G对应字节.. 看文件属性,实际尺寸是小了,但内容似乎也丢了..因为自己把该文件做成虚拟盘 ...

  10. Mybatis 的常见面试题

    背景:好久没用Mybatis了,有些面试题还是要好好准备的. Mybatis 的常见面试题