求助喵!!
查看原帖
求助喵!!
1065103
Atri_Lobato楼主2024/7/13 20:16
#include<iostream>
#include<cstdio>
#include<cstring>
#define ull unsigned long long int
using namespace std;
const int HASH=1000000009;
int n;
char s[500005];
ull Hash[500005];
ull power[500005];
int prime[100005];
bool num[500005];
int min_num[500005];
void init()
{
	power[0]=1;
	for(int i=1;i<=n;i++)
	{
		power[i]=power[i-1]*HASH;
	}
	for(int i=1;i<=n;i++)
	{
		Hash[i]=Hash[i-1]*HASH+(ull)s[i];
	}
	prime[1]=1;
	prime[0]=1;
	for(int i=2;i<=n;i++)
	{
		if(num[i]==0)
		{
			prime[0]++;
			prime[prime[0]]=i;
		}
		for(int q=2;prime[q]*i<=n&&q<=prime[0];q++)
		{
			num[prime[q]*i]=1;
			min_num[prime[q]*i]=prime[q];
			if(i%prime[q]==0)
				break;
		}
	}
}
ull hash_get(int start,int end)
{
	return Hash[end]-Hash[start-1]*power[end-start+1];
}

int work(int start,int end,int length)
{
	int ans=length;
	if(hash_get(start,end-length)==hash_get(start+length,end))
	{
		if(min_num[length]==0)
		{
			return ans;
		}
		else
		{
			int tmp=min_num[length];
			int ans1,ans2;
			ans1=work(start,end,tmp);
			ans2=work(start,end,length/tmp);
			ans=min(min(ans,ans1),ans2);
			return ans;	
		}
	}
	else
	{
		return 999999999;
	}
}
int main()
{
	int q=0;
	scanf("%d",&n);
	scanf("%s",s+1);
	init();
	scanf("%d",&q);
	while(q--)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		if(work(a,b,1)==1)
		{
			printf("1\n");
			continue;
		}
		printf("%d\n",work(a,b,b-a+1));
	}
	return 0;
}
2024/7/13 20:16
加载中...