正解:对于一个区间l,r,它的循环节长度一定是它的因数。
然后如果循环节是这个长度,那么[l+len,r]一定等于[l,r-len]。
然后每次询问的时候就把它的长度的最小质因子提出来。
BZOJ上都A了,然而LOJ上T了一个点。
//<!-- // :: // :;J7, :, ::;7: // ,ivYi, , ;LLLFS: // :iv7Yi :7ri;j5PL // ,:ivYLvr ,ivrrirrY2X, // :;r@Wwz.7r: :ivu@kexianli. // :iL7::,:::iiirii:ii;::::,,irvF7rvvLujL7ur // ri::,:,::i:iiiiiii:i:irrv177JX7rYXqZEkvv17 // ;i:, , ::::iirrririi:i:::iiir2XXvii;L8OGJr71i // :,, ,,: ,::ir@mingyi.irii:i:::j1jri7ZBOS7ivv, // ,::, ::rv77iiiriii:iii:i::,rvLq@huhao.Li // ,, ,, ,:ir7ir::,:::i;ir:::i:i::rSGGYri712: // ::: ,v7r:: ::rrv77:, ,, ,:i7rrii:::::, ir7ri7Lri // , 2OBBOi,iiir;r:: ,irriiii::,, ,iv7Luur: // ,, i78MBBi,:,:::,:, :7FSL: ,iriii:::i::,,:rLqXv:: // : iuMMP: :,:::,:ii;2GY7OBB0viiii:i:iii:i:::iJqL;:: // , ::::i ,,,,, ::LuBBu BBBBBErii:i:i:i:i:i:i:r77ii // , : , ,,:::rruBZ1MBBqi, :,,,:::,::::::iiriri: // , ,,,,::::i: @arqiao. ,:,, ,:::ii;i7: // :, WJMZBMR ,,:::::,:::::::::,, ,:i,:,,,,,::i:iiii // :: BBBBBBBBB0, ,,::: , ,:::::: , ,,,, ,,::::::: // i, , ,8BMMBBBBBBi ,,:,, ,,, , , , , , :,::ii::i:: // : iZMOMOMBBM2::::::::::,,,, ,,,,,,:,,,::::i:irr:i:::, // i ,,:;u0MBMOG1L:::i:::::: ,,,::, ,,, ::::::i:i:iirii:i:i: // : ,iuUuuXUkFu7i:iii:i:::, :,:,: ::::::::i:i:::::iirr7iiri:: // : :rk@Yizero.i:::::, ,:ii:::::::i:::::i::,::::iirrriiiri::, // : 5BMBBBBBBSr:,::rv2kuii:::iii::,:i:,, , ,,:,:i@petermu., // , :r50EZ8MBBBBGOBBBZP7::::i::,:::::,: :,:,::i;rrririiii:: // :jujYY7LS0ujJL7r::,::i::,::::::::::::::iirirrrrrrr:ii: // ,: :@kevensun.:,:,,,::::i:i:::::,,::::::iir;ii;7v77;ii;i, // ,,, ,,:,::::::i:iiiii:i::::,, ::::iiiir@xingjief.r;7:i, // , , ,,,:,,::::::::iiiiiiiiii:,:,:::::::::iiir;ri7vL77rrirri:: // :,, , ::::::::i:::i:::i:i::,,,,,:,::i:i:::iir;@Secbone.ii::: // //--> #include <iostream> #include <cstdio> #include <vector> #include <cstring> using namespace std; const int base=37,mod=998244353; int n,mnpr[500005],tot,prim[500005]; bool vis[500005]; unsigned long long pow[500005]; unsigned long long hsh[500005]; char s[500005]; #define gc getchar inline int rd() { register int x=0;register char ch=gc(); while(!isdigit(ch)) ch=gc(); while(isdigit(ch)) {x=x*10ll+(ch^48);ch=gc();} return x; } unsigned long long gethsh(int l,int r) { return (hsh[r]-hsh[l-1]*pow[r-l+1]%mod+mod)%mod; } void getmn() { mnpr[1]=1; for(int i=2;i<=500000;i++) { if(!vis[i]) prim[++tot]=i,vis[i]=1,mnpr[i]=i; for(int j=1;j<=tot&&prim[j]*i<=500000;j++) { vis[i*prim[j]]=1;mnpr[i*prim[j]]=min(mnpr[i*prim[j]],prim[j]); if(i%prim[j]==0) {mnpr[i]=prim[j];break;} } } } int main() { memset(mnpr,0x3f,sizeof mnpr); n=rd(); char ch=gc(); while(ch<'a'||ch<'z')ch=gc(); for(int i=1;i<=n;i++) s[i]=ch,ch=gc(); getmn(); pow[0]=1; hsh[0]=1; for(int i=1;i<=n;i++) { hsh[i]=(hsh[i-1]*base+s[i]-'a'+1)%mod; pow[i]=pow[i-1]*base%mod; } int q,l,r; q=rd(); while(q--) { l=rd();r=rd(); if(l>r) swap(l,r); int len=r-l+1,ans=len; while(len!=1&&len>0) { if(gethsh(l,r-ans/mnpr[len])==gethsh(l+ans/mnpr[len],r)) ans=ans/mnpr[len]; len=len/mnpr[len]; } printf("%d ",ans); } }