当前位置: 首页 > 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;
	}
}

相关文章:

  • 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做分析
  • 国际博物馆日|航海博物馆:穿梭于海洋神话与造船工艺间
  • 蒲慕明院士:好的科普应以“质疑、讨论公众关切的科学问题”为切入点
  • 国宝文物子弹库帛书二、三卷从美启程,18日凌晨抵京
  • 摄影师|伊莎贝尔·穆尼奥斯:沿着身体进行文化溯源
  • 《制止滥用行政权力排除、限制竞争行为规定(修订草案征求意见稿)》公开征求意见
  • 中国物流集团等10家央企11名领导人员职务任免