求助,70pts
  • 板块学术版
  • 楼主gcx12012
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/1/2 12:20
  • 上次更新2023/10/24 05:50:04
查看原帖
求助,70pts
494601
gcx12012楼主2023/1/2 12:20
#include<bits/stdc++.h>
#include<cmath>
#define ll long long

using namespace std;
const int mod=1e9+7;
int has[500010],p[500010];
char s[500010];
int n,q;
vector<int >ys[500010];
ll read(){
	ll x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}


int main()
{
	n=read();
	p[0]=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j*i<=n;j++) ys[j*i].push_back(i);
		sort(ys[i].begin(),ys[i].end());
	}
	for(int i=1;i<=n;i++) p[i]=(1ll*p[i-1]*131)%mod; 
	for(int i=1;i<=n;i++) cin>>s[i];
	for(int i=1;i<=n;i++) has[i]=(1ll*has[i-1]*131+s[i])%mod;
	q=read();
	while(q--){
		int l=read(),r=read();
		int len=r-l+1;
		for(int i=0;i<ys[len].size();i++){
			int changdu=ys[len][i];
			int nowl=l,is=1;
			while(nowl<=r){
				if(((1ll*has[nowl+changdu-1]-(1ll*has[nowl-1]*p[changdu])%mod)+mod)%mod!=((1ll*has[l+changdu-1]-(1ll*has[l-1]*p[changdu])%mod)+mod)%mod){
					is=0;
					break;
				}
				nowl+=changdu;
			}
			if(is){
				cout<<changdu<<'\n';
				break;
			}
		}
	}
	return 0;
}

O2+卡常70pts

2023/1/2 12:20
加载中...