纯良萌新求助简简单单小哈希
查看原帖
纯良萌新求助简简单单小哈希
264490
hmya楼主2022/10/27 09:59
#include<bits/stdc++.h>
using namespace std;
const int Mt=1e5;
inline char getc(){
	static char buf[Mt],*p1=buf,*p2=buf;
	return p1==p2&&(p2=(p1=buf)+fread(buf,1,Mt,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
	int r=0,f=1;char c=getc();
	while(!isdigit(c)){if(c=='-')f=-1;c=getc();}
	while(isdigit(c))r=(r<<1)+(r<<3)+(c^48),c=getc();
	return r*f;
}
int n;
string S;
int m;
const unsigned long long base=999983;
unsigned long long power[500005];
unsigned long long has[500005];
int gethas(int lt,int rt){
    return has[rt]-has[lt-1]*power[rt-lt+1];
}

int main(){
    cin>>n;
    cin>>S;
    S='?'+S;
    power[0]=1;
    for(int i=1;i<=n;i++){
        power[i]=power[i-1]*base;
    }
    for(int i=1;i<=n;i++){
        has[i]=has[i-1]*base+S[i];
    }
    m=read();
    while(m--){
        int lt,rt;
        lt=read();
        rt=read();
        int len=rt-lt+1;
        int ans=len;
        for(int p=1;p*p<=len;p++){
            if(len%p)continue;
            int q=len/p;
            // printf("%d %d %d %d\n",ans,p,q,len);
            if(gethas(lt,rt-p)==gethas(lt+p,rt)){
                ans=min(ans,p);
                break;
            }
            if(q==len)continue;
            if(gethas(lt,rt-q)==gethas(lt+q,rt)){
                ans=min(ans,q);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
/*
重复后同S相等的最短的串
O(qsqrtn),枚举循环节长度,对于每个长度的判断都是O(1)的。

8
aaabcabc
3
1 3
3 8
4 8
*/

RT,TLE on #3

2022/10/27 09:59
加载中...