[POI2012]OKR-A Horrible Poem

正解:对于一个区间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);
    }
}
OKR
我是咸鱼。转载博客请征得博主同意Orz
原文地址:https://www.cnblogs.com/sdfzhsz/p/9755049.html