#include<bits/stdc++.h>
using namespace std;
const int b=233,c=10007,M=500010;
typedef unsigned long long ull;
char s[M];
ull t,sum1[M],sum2[M],power1[M],power2[M];
ull get_hush1(int x,int y){
return sum1[y]-sum1[x-1]*power1[y-x+1];
}
ull get_hush2(int x,int y){
return sum2[y]-sum2[x-1]*power2[y-x+1];
}
int main(){
int l,q,i,j,x,y,len;
scanf("%d\n%s%d",&l,s+1,&q);
power1[0]=power2[0]=1;
for(i=1;i<=l;i++){
power1[i]=power1[i-1]*b;
power2[i]=power2[i-1]*c;
}
sum1[0]=sum2[0]=0;
for(i=1;i<=l;i++){
sum1[i]=sum1[i-1]*b+(s[i]-'a');
sum2[i]=sum2[i-1]*c+(s[i]-'a');
}
for(i=1;i<=q;i++){
scanf("%d%d",&x,&y);
t=len=y-x+1;
for(j=2;j*j<=t;j++){
while(len%j==0&&get_hush1(x,y-len/j)==get_hush1(x+len/j,y)&&get_hush2(x,y-len/j)==get_hush2(x+len/j,y)){
y=x+len/j-1;
len=y-x+1;
}
while(t%j==0)t/=j;
}
if(t!=1&&get_hush1(x,y-len/t)==get_hush1(x+len/t,y)&&get_hush2(x,y-len/t)==get_hush2(x+len/t,y))
len/=t;
printf("%d\n",len);
}
return 0;
}
BZOJ 2795
最新推荐文章于 2019-01-08 21:29:00 发布