#include<iostream>
#include<string.h>

using namespace std;

long long pow[4000],pow1[4000];
long long hash[4000],hash1[4000];

int base=31;
int len;
#define Mod 1000000007
#define Nod 998244353

long long gethash(int l,int r){
//	cout<<hash[r]<<" "<<hash[l]<<" "<<pow[r-l]<<" "<<(hash[r]-hash[l]&pow[r-l]%Mod)%Mod<<endl;
	return (hash[r]-hash[l]*pow[r-l]%Mod)%Mod;
}
long long gethash1(int l,int r){
	return (hash1[r]+Nod-hash1[l]*pow1[r-l]%Nod)%Nod;
}

void solve(int &left,int &right,int &Len){
	for(int i=1;i<=len/2;i++){
		for(int j=0;j+2*i<=len;j++){
			for(int k=j+i;k+i<=len;k++){
	//		 	cout<<i<<" "<<j<<" "<<k<<" "<<endl;
	//		 	cout<<gethash(j,j+i)<<" "<<gethash(k,k+i)<<endl;
				if(gethash(j,j+i)==gethash(k,k+i)&&gethash1(j,j+i)==gethash1(k,k+i)){
					
					left=j;
					right=k;
					Len=i;	
				}	
			}				
		}
	}
	return ;
}


int main()
{
	char s[4000]; 
	pow[0]=1,pow1[0]=1;
	int N;
	cin>>N;
	scanf("%s",s+1);
	len=strlen(s+1);
	int left=0,right=0,Len=0;
	for(int i=1;i<=len;i++){
		pow[i]=(pow[i-1]*base)%Mod;
		pow1[i]=(pow1[i-1]*base)%Nod;
	}
	for(int i=1;i<=len;i++){
		hash[i]=(hash[i-1]*base+s[i]-'a'+1)%Mod;
		hash1[i]=(hash1[i-1]*base+s[i]-'a'+1)%Nod;
	}
//	cout<<gethash(2,3)<<"&&"<<endl;
//	for(int i=0;i<=len;i++) cout<<hash[i]<<" ";
	solve(left,right,Len);
	cout<<Len;
	return 0;
}