P3538 题解
P3538
超弱省选题
给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节。
其中
分析:
首先:字符串
那么显然任意循环节的长度一定是
至于判断字符串相等,Hash即可,这时候你想到了一个结合Hash的枚举约数暴力算法,得到了
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
#define N 500050
int prime[N],vis[N],n,m;
unsigned long long hsh[N];
char a[N];
vector<int>d[N];
void find(){
for(int i=1;i<=n;i++){
for(int j=1;i*j<=n;j++){
d[i*j].push_back(i);
}
}
}
int power(unsigned long long a,int b){
unsigned long long ans=1;
while(b){
if(b&1)ans=ans*a;
a=a*a;
b>>=1;
}
return ans;
}
void init(){
cin>>n;
cin>>a+1;
cin>>m;
}
void Hash(){
for(int i=1;i<=n;i++){
hsh[i]=1ull*hsh[i-1]*131+(a[i]-'a');
}
}
int get(int l,int r){
return hsh[r]-hsh[l-1]*power(131ull,r-l+1);
}
int solve(){
int l,r;
cin>>l>>r;
int len=r-l+1;
int siz=d[len].size();
for(int i=0;i<siz;++i){
int x=d[len][i];
if(get(l,r-x)==get(l+x,r)){
return x;
}
}
return len;
}
int main(){
ios::sync_with_stdio(false);
init();
find();
Hash();
while(m--){
printf("%d\n",solve());
}
}
很明显,这个算法虽然平均复杂度是
它的复杂度主要在于分解约数时。这启发我们考虑进一步缩小约数范围,也即若一个存在一个循环节,长度为
先我们来食用线性筛处理出每个数的最小质因数,那么因为约数也都是质因数组合而来,可以考虑对于最初的
所以答案正确,然后又因为我们枚举所有的质因数及其幂次,复杂度也是严格小于等于
#define N 500050
int prime[N],vis[N],n,m,cnt;
unsigned long long hsh[N],p[N];
char a[N];
map<pair<int,int>,int>ans;
vector<int>d[N];
void find(){
vis[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]){
vis[i]=i;
prime[++cnt]=i;
}
for(int j=1;j<=cnt;j++){
if(prime[j]>vis[i]||prime[j]*i>n)break;
vis[prime[j]*i]=prime[j];
}
}
}
void init(){
cin>>n;
cin>>a+1;
cin>>m;
}
void Hash(){
p[0]=1;
for(int i=1;i<=n;i++){
hsh[i]=1ull*hsh[i-1]*131+(a[i]-'a');
p[i]=p[i-1]*131;
}
}
int get(int l,int r){
return hsh[r]-hsh[l-1]*p[r-l+1];
}
int solve(){
int l,r;
cin>>l>>r;
int tmp=r-l+1,lst=r-l+1;
if(get(l,r-1)==get(l+1,r))return 1;
while(vis[lst]>1){
if(get(l,r-tmp/vis[lst])==get(l+tmp/vis[lst],r)){
tmp=tmp/vis[lst];
}
lst/=vis[lst];
}
return tmp;
}
int main(){
ios::sync_with_stdio(false);
init();
find();
Hash();
while(m--){
printf("%d\n",solve());
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!