90pts TLe on #3求助
查看原帖
90pts TLe on #3求助
183026
Cocoly1990楼主2021/8/13 23:29
#include<bits/stdc++.h>
#define ll long long
#define Maxn 500007
#define Mod 1000000007
#define Base 31
using namespace std ;
int tot , n , q , l , r , ans , len ;
char s[Maxn] ;
ll g[Maxn] , Prime[Maxn] , fra[Maxn] , hash[Maxn] ;
bool Isp[Maxn] ;
void GetPrime(int n)
{
	for(ll i = 2 ; i <= n ; i ++)
	{
		if(! Isp[i]) Prime[++ tot] = i , g[i] = i ;
		for(int j = 1 ; j <= tot && Prime[j] * i <= n ; j ++)
		{
			Isp[Prime[j] * i] = 1 , g[Prime[j] * i] = Prime[j] ;
			if(!(i % Prime[j])) break ;
		} 
	}
}
ll Sum(int x , int y)
{
	return ((hash[y] - hash[x - 1] * fra[y - x + 1]) % Mod + Mod) % Mod ;
}
void pre()
{
	fra[0] = 1 ;
	for(int i = 1 ; i <= n ; i ++)
		hash[i] = (hash[i - 1] * Base + s[i] - 'a' + 1) % Mod ,
		fra[i] = (fra[i - 1] * Base) % Mod ;
	
	
}
int main()
{
	cin >> n ;
	GetPrime(n) ;
	scanf("%s", s + 1) ;
	pre() ;
	//cout << Sum(4 , 7) << " " << Sum(5 , 8) << " " ;
	//cout << endl << endl ;
	cin >> q ;
	while(q --)
	{
		cin >> l >> r ;
		len = r - l + 1 ;
		ans = len ;
		//cout << len << "!" << endl ;
		if(Sum(l + 1 , r) == Sum(l , r - 1)) 
		{
			cout << "1" << endl ;
			continue ;
		}
		while(len > 1)
		{
			//cout << Sum(l + ans / g[len] , r) << " " << Sum(l , r - ans / g[len]) << endl ;
			if(Sum(l + ans / g[len] , r) == Sum(l , r - ans / g[len])) 
				ans /= g[len] ;
			len /= g[len] ;
			//cout << ans << " " << len ;
		}
		cout << ans << endl ;
	}
	return 0 ;
} 
2021/8/13 23:29
加载中...