洛谷P3538 [POI2012] OKR-A Horrible Poem

news/2024/11/18 12:13:34/文章来源:https://www.cnblogs.com/SkyNet-PKN/p/18552310

前言

比较典,可以当模板题,故记录一下,写的可能比较水。

题意

Link

长度为 \(n\ (\leq 6\times 10^5)\) 的字符串,有 \(q\ (\leq 2\times 10^6)\) 个询问,每次询问求一个区间的最小循环节。

思路

题面看起来很唬人,我们平时求最短循环节都是用前缀函数,这一放在区间上就不会做了。

但实际上很简单,最小循环节的长度一定是串长的因数,因此直接枚举即可,用线性筛记录每个数最大的质因数来优化,不断除以自己最大的质因数即可枚举所有因数。

至于判断一个长度是否为循环节,可以用哈希,设长度为 \(len\),如果 \(\operatorname{Substr}[l,r-len]=\operatorname{Substr}[l+len,r]\) 则说明该长度为循环节长度。

复杂度当然就是 \(O(q\cdot d(n))\),这个 \(d(n)\) 就很玄学,据说可以证明最多 \(O(\sqrt n)\),但实际经常跑不满,反正卡常题。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN=5e5,MAXQ=2e6;
LL bs=13131,bspw[MAXN+5],P=1e9+321;
int n,q;
char str[MAXN+5];inline void init_bspw(){bspw[0]=1;for(int i=1;i<=n;i++)bspw[i]=bspw[i-1]*bs%P;
}
struct HashNode{LL val;int len;HashNode(){}HashNode(LL a,int b):val(a),len(b){}
};
inline HashNode operator + (const HashNode& a,const HashNode& b){HashNode res;res.val=(a.val*bspw[b.len]%P+b.val)%P;res.len=a.len+b.len;return res;
}
inline HashNode operator - (const HashNode& a,const HashNode& b){//b is prefix of aHashNode res;res.val=(a.val-b.val*bspw[a.len-b.len]%P+P)%P;res.len=a.len-b.len;return res;
}
inline bool operator == (const HashNode& a,const HashNode& b){return (a.len==b.len) && (a.val==b.val);
}
class HashString{
private:HashNode hs[MAXN+5];
public:inline void build(){hs[0]=HashNode(0,0);for(int i=1;i<=n;i++)hs[i]=HashNode(str[i]-'a'+1,1);for(int i=1;i<=n;i++)hs[i]=hs[i-1]+hs[i];}inline HashNode query(const int& l,const int& r) const{return hs[r]-hs[l-1];}
}hs;vector<int>prime;
bool vis[MAXN+5];
int divisor[MAXN+5];
inline void init_prime(){for(int i=2;i<=n;i++){if(!vis[i]) prime.push_back(i),divisor[i]=i;for(auto it:prime){if(1LL*it*i>n) break;vis[it*i]=true;divisor[it*i]=it;if(i%it==0) break;}}
}inline bool check(int l,int r,int len){return hs.query(l,r-len)==hs.query(l+len,r);
}int main(){scanf("%d",&n);scanf("%s",str+1);init_bspw();init_prime();hs.build();scanf("%d",&q);int l,r,len,tmp;while(q--){scanf("%d %d",&l,&r);len=tmp=r-l+1;while(tmp>1){if(check(l,r,len/divisor[tmp])) len/=divisor[tmp];tmp/=divisor[tmp];}printf("%d\n",len);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/836091.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【大模型】模型安全

核心内容来自《大模型安全研究报告(2024年).pdf》 更多的安全内容见内部“语雀-大模型”-笔记真实性:训练数据能真实反映物理世界客观规律和人类社会实际运转情况的性质。 多样性:训练数据应覆盖尽可能多的样本,以确保大模型能对不同情况进行泛化的性质。 准确性:针对所规…

基于WPF开发视频播放器

在实际应用中,视频播放功能在很多软件中都会用到,将音频和视频集成到应用程序中不仅可以增强用户体验,还能起到事半功倍的效果。今天本文以一个简单的小例子,简述如何通过WPF中的MediaElement开发视频播放器,仅供学习分享使用,如有不足之处,还请指正!在实际应用中,视频…

wincc 7.5SP2下VBA编程学习练习15:批量删除变量

在前面练习的基础上学习批量删除变量。 新建下面的脚本: Sub DeleteTags()批量删除变量Dim hmigo As hmigoDim strTagName As StringDim i As IntegerSet hmigo = New hmigoFor i = 1 To 5 strTagName = "Real" & CStr(i) hmigo.DeleteTag strTagNameNext…

vue2-基础核心

vue简介 vue中文官网动态构建用户界面的渐进式 JavaScript 框架 vue的特点:遵循MVVM模式 采用组件化模式,提高代码复用率,让代码更好维护 声明式编码,无需直接操作DOM,提高开发效率,编码简洁、体积小,运行效率高 本身只关注UI,也可以引入其他三方库开发项目 使用虚拟DOM…

数据采集与融合技术实践作业四

数据采集与融合技术实践作业四 gitee链接:https://gitee.com/wei-yuxuan6/myproject/tree/master/作业4 作业① selenium爬取股票实验要求: 熟练掌握 Selenium 查找 HTML 元素、爬取 Ajax 网页数据、等待 HTML 元素等内容。 使用 Selenium 框架+ MySQL 数据库存储技术路线爬取…

creo装配体零件合并

一张图看懂creo5.0中装配体转零件creo中自带装配体转成零件的功能,无需另存为stp再以零件方式打开(可能出现烂面情况)1.先在装配体中创建一个空的零件;2.在装配体下按图中步骤进行操作,最终创建的空零件将变成装配体转成的零件

jenjins设置中文界面

参考 https://blog.csdn.net/weixin_45131680/article/details/142759961点击Manage Jenkins下滑到System Configuration 点击Manage Plugins点击“可选插件”,输入“Locale”点击Install without restart等待下载完成 显示“sucess”即为安装完成,然后点击管理jenkins下滑到…

又稳又快!基于ByteHouse ELT构建高性能离/在线一体化数仓

近期,ByteHouse与某数字娱乐公司达成合作,双方聚焦高性能离/在线一体化数仓展开合作。近期,ByteHouse与某数字娱乐公司达成合作,双方聚焦高性能离/在线一体化数仓展开合作。随着自身领域迅速发展的同时,该数字娱乐公司需要更稳定、易用的数据基础服务,但该方面遇到多种挑…

js设置浏览器cookie

https://blog.csdn.net/x550392236/article/details/77651579

猫映射(Arnold变换),猫脸变换介绍与基于例题脚本的爆破

前置信息 http://www.jiamisoft.com/blog/index.php/7249-erzhituxiangjiamisuanfaarnold.html https://mp.weixin.qq.com/s/IbkAlyAPvbgMeNgqfwisTg Arnold变换 Arnold变换是V.J.Arnold在遍历理论的研究中提出的一种变换,原意为catmapping,俗称猫脸变换。Arnold变换直观、简…

伯索云学堂视频课件课程下载工具,如何在电脑端下载伯索云学堂视频课程课件资料PDF,PPT到本地?

一. 安装伯索云课程下载器 1.获取学无止下载器 https://www.xuewuzhi.cn/plaso_downloader 2.下载安装后,然后点击桌面快捷方式运行即可。 注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。 二. 使用说明 1.学无止下载…

一个自托管免费开源的人脸识别系统

大家好,今天给大家分享一个自托管免费开源的人脸识别系统CompreFace。CompreFace 是一个开源的人脸识别系统,由 Exadel 公司开发并维护。它提供了一个基于深度学习的解决方案,用于人脸检测、识别和验证。 CompreFace 的设计旨在简化人脸识别技术的使用,使得开发者无需深入理…