当前位置: 首页 > news >正文

P1659 [国家集训队] 拉拉队排练 (manacher 算法)

P1659 [国家集训队] 拉拉队排练 - 洛谷

这题需要求前k大的回文子串的长度的乘积。因为n的大小为1e6 ,所以我们只能使用manacher 线性的来找到所有的回文子串。 其中长度大的回文子串可以包含小的回文子串,所以其实我们只需要知道以每一个位置为回文中心的回文子串长度即可。最后只用快速幂来求解。

string s,s1;
int n,k;
const int N = 2e6+10;
int h[N];
void change(){
	s1+='?';
	for (int i=1;i<=n;i++){
		s1+='#';
		s1+=s[i];
	}
	s1+='#';
	n=n*2+2;
}//mancacher 预处理
int mp[N];
void manachar(){
	int mid=0,r=0;
	for (int i=1;i<=n;i++){
		if(i<r){
			h[i]=min(h[2*mid-i],r-i);
		}
		else {
			h[i]=1;
		}
		while(s1[i+h[i]]==s1[i-h[i]]){
			h[i]++;
		}
		if(i+h[i]>r){
			r=i+h[i];
			mid=i;
		}
		if((h[i]-1)%2==1){
			mp[(h[i]-1)]++;
		}//如果长度是奇数,就使用桶存起来
	}
}

signed main()
{
	IOS
	//........................./
	cin>>n>>k;
	cin>>s;
	s=" "+s;
	int len = n;
	change();
	manachar();
	int ans=1;
	int sum=0;
	for (int i=len;i>=1;i--){
		if((i&1)){
			sum+=mp[i];//重点是这里,更大的奇数回文子串是可以包含小的回文子串的。
			if(k>sum){
				ans=(ans*qmi(i,sum))%mod;
				k-=sum;
			}
			else {
				ans=(ans*qmi(i,k))%mod;
				k=0;
				break;
			}
		}
	}
	if(k>0){
		cout<<-1<<endl;
	}
	else {
		cout<<ans%mod<<endl;
	}
}

http://www.dtcms.com/a/80000.html

相关文章:

  • Sampling – Model Context Protocol Specification
  • 缓存监控治理在游戏业务的实践和探索
  • Cursor设置中文教程----两种方法【简单】
  • 统计领域英语专业词汇补充
  • 如何用AI轻松实现PPT自动生成,让工作更高效
  • Qt 控件概述 QLabel
  • Unity-VR中使用手柄点击UI
  • c语言 逆序存放并输出的题【基础】
  • hackmyvm-connection
  • 32、如何解决vector中删除元素导致的迭代器失效问题?
  • 【编译原理】一二章
  • 手机换IP有什么用?最新换IP方法
  • 【秣厉科技】LabVIEW工具包——OpenCV 教程(11):人脸检测与识别
  • Android第五次面试总结(网络补充)
  • Thinkphp指纹识别
  • Kubernets命名空间
  • QT6通过DeepSeek API上传附件实现
  • 【文件操作】IO流
  • MPLS基础---通俗易懂
  • 通过启用Ranger插件的Hive审计日志同步到Doris做分析
  • Android studio无法查看源码
  • 小酌SM2的背景、数字签名
  • 慕慕手记项目日记 首页数据的渲染,使用js 2025-3-16
  • 【Linux内核系列】:动静态库详解
  • 企业数据治理解决方案(46页PPT)(文末有下载方式)
  • CMAC算法原理
  • springboot 打包 failed with MalformedInputException: Input length = 1
  • SaaS系统的销售微服务与权限微服务边界设计
  • 湖仓一体:数据湖与数据仓库的融合模式解析
  • 算法系列——有监督学习——3.逻辑回归