唔。。。。话说好久没有发布题解了(手痒痒了

首先特别鸣谢lykkk大佬今天下午教我Manacher算法,甚是感谢

为了体现学习成果,写一篇蒟蒻版的题解(大佬勿喷

言归正传


题面——>在这儿

首先做这道题要掌握一个算法——Manacher算法

简要说他就是用来解决回文串相关问题的算法,并不高深

由题意可知,显然每一个和谐群体就是一个长度为奇数的回文串

用Manacher可以求每个位置的回文半径

因为我们只要求奇数个的回文串,那么显然我们不需要在字符串里添加一些无关字符

那么我们用Manacher求出以当前位置为中心的最长回文子串长度

所以我们就会在求的同时搞出最长的len

然后根据对称性可知也有长为len*2-1的回文子串,接着我们只需要统计一下就可以了

注意我们只要奇数个,去掉偶数个

因为数据范围过大,所以我们要Fast_Pow使得不会爆掉

那么。。。下面我们来看一下我优秀的代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod = ;
const int N = ;
char s[N],str[N*];
int p[N*],cnt[N];
int len,n;
ll ans=,k;
ll ksm(int x,int y) {//因为数据范围很大容易爆掉,所以就要Fast_Pow
if(x==) return ;
ll res=,base=x;
while(y) {
if(y&) res=(res*base)%mod;
base=(base*base)%mod;
y>>=;
}
return res;
}
void manacher() {//Manacher模板,详见洛谷P3805
for(int i=; i<=len; i++) str[i*-]='%',str[i*]=s[i];
str[len=len*+]='%';
int id=,mx=;
for(int i=; i<=len; i++) {
if(i<mx) p[i]=min(p[id*-i],mx-i);
else p[i]=;
while(p[i]+i<=len && i-p[i]>= && str[i+p[i]]==str[i-p[i]]) p[i]++;
if(p[i]+i>mx) id=i,mx=i+p[i];
if((p[i]-)%) cnt[p[i]-]++;
}
}
int main() {
int sum=;
cin>>n>>k>>s+;
len=n;
manacher();
for(int i=n; i>=; --i) {//根据题意常规操作
if(i%==) continue;
sum+=cnt[i];
if(k>=sum) {
ans=(ans*ksm(i,sum))%mod;
k-=sum;
} else {
ans=(ans*ksm(i,k))%mod;
k-=sum;
break;
}
}
if(k>) ans=-;
cout<<ans;
return ;
}

完结,撒花!!

最新文章

  1. class.c 添加中文注释(3)
  2. linux c++应用程序内存高或者占用CPU高的解决方案_20161213
  3. Bitnami Redmine插件记录
  4. XAF点滴:很具体很用实用---处理三个小问题
  5. 自己写的基于bootstrap风格的弹框插件
  6. python之路-Day8
  7. javascript笔记5-BOM
  8. Android Studio上的几个插件
  9. 【极角排序、扫描线】UVa 1606 - Amphiphilic Carbon Molecules(两亲性分子)
  10. C++引用之引用的使用
  11. angularjs directive中@ = &amp;使用详解
  12. 十四、oracle 数据库管理--管理表空间和数据文件
  13. Linux学习笔记--一些错误的记录
  14. js两个叹号的使用
  15. 鸟哥的linux私房菜学习-(五)补充:重点回顾
  16. 常见的网页图像格式有 ico、jpg、png、gif,说说他们各自的应用场景
  17. RabbitMQ管理界面
  18. SpringBoot的第一个web项目
  19. 并行网络爬虫(C++实现)
  20. LeetCode295-Find Median from Data Stream &amp;&amp; 480. 滑动窗口中位数

热门文章

  1. AI产品的商业模式
  2. 从零开始学安全(四十三)●Wireshark分析ICMP(IP)协议
  3. C# NuGet包管理命令
  4. 多态以及 LeetCode 每日一题
  5. (详细)华为荣耀4X CHE-TL00H的usb调试模式在哪里打开的步骤
  6. 【English】九、kids/children/toddlers 三个单词的区别
  7. Java中单例模式的几种实现
  8. RAID5当一块硬盘离线后处理
  9. go打造以太坊合约测试框架
  10. ASP.NET实现二维码