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

首先特别鸣谢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 ;
}

完结,撒花!!

luogu P1659 [国家集训队]拉拉队排练的更多相关文章

  1. 洛谷 P1659 [国家集训队]拉拉队排练(Manacher)

    题目链接:https://www.luogu.com.cn/problem/P1659 思路: 首先跑一遍Manacher,用$cnt_i$记录长为$i$的回文串有多少个. 所记录的$cnt$并不是最 ...

  2. P1659 [国家集训队]拉拉队排练

    思路 求出cnt和len之后,直接乘起来即可 代码 #include <cstdio> #include <algorithm> #include <cstring> ...

  3. Manacher【p1659】 [国家集训队]拉拉队排练

    题目描述 n个女生举牌子(只含有26个小写字母,长度为n的字符串), 如果连续的一段女生,有奇数个,并且她们手中的牌子所写的字母,从左到右和从右到左读起来一样,那么这一段女生就被称作和谐小群体. 现在 ...

  4. 【洛谷 P1659】 [国家集训队]拉拉队排练(manacher)

    题目链接 马拉车+简单膜你 #include <cstdio> #include <cstring> #include <algorithm> using name ...

  5. 题解 P1659 【[国家集训队]拉拉队排练】

    一眼可得PAM 如果没学过PAM的可以看这里:PAM学习小结 我们令PAM上多记录一个信息\(sum\),表示该节点表示串在原串上出现了多少次. 当我们处理完了\(sum\),对于长度\(len\)为 ...

  6. [回文树][BZOJ2160][国家集训队]拉拉队排练

    题面 Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮 ...

  7. [国家集训队]拉拉队排练 Manancher_前缀和_快速幂

    Code: #include <cstdio> #include <algorithm> #include <cstring> using namespace st ...

  8. [国家集训队] 拉拉队排练 - Manacher

    用 Manacher 跑出回文串长,注意这里不需要偶数长度所以不需要对串做一些奇怪的处理 然后用前缀和搞一下,计算答案时跑快速幂即可 #include <bits/stdc++.h> us ...

  9. luogu P2757 [国家集训队]等差子序列

    题目链接 luogu P2757 [国家集训队]等差子序列 题解 线段树好题 我选择暴力 代码 // luogu-judger-enable-o2 #include<cstdio> inl ...

随机推荐

  1. 从官方文档去学习之FreeMarker

    一.前言 上一篇 <从现在开始,试着学会用官方文档去学习一个技术框架>提倡大家多去从官方文档学习技术,没有讲到具体的实践,本篇就拿一个案例具体的说一说,就是FreeMarker,选择这个框 ...

  2. Raptor入门与安装

    作为计算机导论的一部分,Raptor的图形化界面可以让编程的初学者更加容易深入理解算法,可以作为一个简单入门的学习工具. 1.Raptor是什么? Raptor( the Rapid Algorith ...

  3. 简述ADO中如何使用参数化的命令对象以及增删改查,存储过程的操作

    连接数据库代码: private SqlConnection con = null; public void OpenConnection(string connectionString) { con ...

  4. 并发concurrent---3

    背景:并发知识是一个程序员段位升级的体现,同样也是进入BAT的必经之路,有必要把并发知识重新梳理一遍. ConcurrentHashMap:在有了并发的基础知识以后,再来研究concurrent包.普 ...

  5. Docker的介绍及安装

    什么是Dcoker? 引用度娘的解释:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 linux 机器上,也可以实现虚拟化.容器 ...

  6. 在 DotNetCore 3.0 程序中使用通用协议方式启动文件关联应用

    问题描述 在传统的基于 .NET Framework 的 WPF 程序中,我们可以使用如下代码段启动相关的默认应用: # 启动默认文本编辑器打开 helloworld.txt Process.Star ...

  7. 命令模式 Command 行为型 设计模式(十八)

    命令模式(Command) 请分析上图中这条命令的涉及到的角色以及执行过程,一种可能的理解方式是这样子的: 涉及角色为:大狗子和大狗子他妈 过程为:大狗子他妈角色 调用 大狗子的“回家吃饭”方法 引子 ...

  8. Ajax的面试题

    一.什么事Ajax?为什么要用Ajax?(谈谈对Ajax的认识) 什么是Ajax: Ajax是“Asynchronous JavaScript and XML”的缩写.他是指一种创建交互式网页应用的网 ...

  9. 前端页面基于JQuery的点击事件

    一,使用id选择器 1.方式一 $("#id").click(function(){ do something }) 2.方式二 $("#id").on(&qu ...

  10. WebGL或OpenGL关于模型视图投影变换的设置技巧

    目录 1. 具体实例 2. 解决方案 1) Cube.html 2) Cube.js 3) 运行结果 3. 详细讲解 1) 模型变换 2) 视图变换 3) 投影变换 4) 模型视图投影矩阵 4. 存在 ...