luogu P1659 [国家集训队]拉拉队排练
唔。。。。话说好久没有发布题解了(手痒痒了
首先特别鸣谢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 [国家集训队]拉拉队排练的更多相关文章
- 洛谷 P1659 [国家集训队]拉拉队排练(Manacher)
题目链接:https://www.luogu.com.cn/problem/P1659 思路: 首先跑一遍Manacher,用$cnt_i$记录长为$i$的回文串有多少个. 所记录的$cnt$并不是最 ...
- P1659 [国家集训队]拉拉队排练
思路 求出cnt和len之后,直接乘起来即可 代码 #include <cstdio> #include <algorithm> #include <cstring> ...
- Manacher【p1659】 [国家集训队]拉拉队排练
题目描述 n个女生举牌子(只含有26个小写字母,长度为n的字符串), 如果连续的一段女生,有奇数个,并且她们手中的牌子所写的字母,从左到右和从右到左读起来一样,那么这一段女生就被称作和谐小群体. 现在 ...
- 【洛谷 P1659】 [国家集训队]拉拉队排练(manacher)
题目链接 马拉车+简单膜你 #include <cstdio> #include <cstring> #include <algorithm> using name ...
- 题解 P1659 【[国家集训队]拉拉队排练】
一眼可得PAM 如果没学过PAM的可以看这里:PAM学习小结 我们令PAM上多记录一个信息\(sum\),表示该节点表示串在原串上出现了多少次. 当我们处理完了\(sum\),对于长度\(len\)为 ...
- [回文树][BZOJ2160][国家集训队]拉拉队排练
题面 Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮 ...
- [国家集训队]拉拉队排练 Manancher_前缀和_快速幂
Code: #include <cstdio> #include <algorithm> #include <cstring> using namespace st ...
- [国家集训队] 拉拉队排练 - Manacher
用 Manacher 跑出回文串长,注意这里不需要偶数长度所以不需要对串做一些奇怪的处理 然后用前缀和搞一下,计算答案时跑快速幂即可 #include <bits/stdc++.h> us ...
- luogu P2757 [国家集训队]等差子序列
题目链接 luogu P2757 [国家集训队]等差子序列 题解 线段树好题 我选择暴力 代码 // luogu-judger-enable-o2 #include<cstdio> inl ...
随机推荐
- git使用教程指南
前言 Git是一个开源的分布式版本控制系统.其核心就在于版本控制. 在实际编码过程中,我们往往会忘记上次对文件的修改内容.若是刚刚修改的还好说,撤销操作即可.但若这是你昨天做的修改并关闭了IDE呢 ...
- KVO讲解
最近一直在写swift项目,没有时间更新自己的技术博客,以前在博客里面写过KVO的底层原理,今天我们来看一下KVO的整个使用过程和使用场景(附有demo),大约花大家10-15分钟时间,希望大家看完博 ...
- .NET CAD二次开发学习第一天
基于浩辰CAD2019 需求: 开发线转圆简单命令.命令过程:1) 请选择图中直线(要求支持一次选多个):2) 弹出对话框,输入圆的图层名和半径3) 点对话框中确定按钮,结束命令.命令执行效果:所选每 ...
- Windows Server 2008 中iis反向代理设置
1.安装 IIS(Windows专业版自带,如果是server版系统,需要通过功能管理器安装(无需下载)) urlrewrite插件,https://www.iis.net/downloads/mic ...
- centos 7下安装jdk1.8
本篇文章主要介绍在centos7 环境下安装jdk1.8并配置环境变量. 安装步骤 1.下载网址 https://www.oracle.com/technetwork/java/javase/do ...
- PHP八大设计模式
设计模式 单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new建立实例对象的方法. 单例模式 $_instance必须声明为静态的私有变量 构造函数和析构函数必须声 ...
- 你真的懂JavaScript基础类型吗
夯实Javascript基础. 基本类型有六种: null,undefined,boolean,number,string,symbol. 基本类型的值是保存在栈内存中的简单数据段 基础类型特性 基础 ...
- 基于Xamarin Android实现的简单的浏览器
最近做了一个Android浏览器,当然功能比较简单,主要实现了自己想要的一些功能……现在有好多浏览器为什么还要自己写?当你使用的时候总有那么一些地方不如意,于是就想自己写一个. 开发环境:Xamari ...
- 高通MSM8998 ABL的调试
高通在MSM8998上引入了UEFI,用来代替LK(Little Kernel).高通UEFI由XBL和ABL两部分组成.XBL负责芯片驱动及充电等核心应用功能.ABL包括芯片无关的应用如fastbo ...
- 如何将Eclipse的javaWeb项目改为IDEA的maven项目
1.首先去IDEA开发工具创建一个maven项目,把该项目改为Web项目, a.在pom.xml中,添加packaging标签,值为war b.右键File,选中project structure, ...