integer :: n, i, j, ans = 0, z(5000) = 0
character(5000) :: s
read*, n
read*, s
do i = 1, n-1
  z(i:n) = z_algorithm(s(i:n))
  !i 今回のダジャレの前句の起点
  !j 今回のダジャレの後句の起点
  !あいあいあーの場合
  !i=1,j=3のときにz=3となっているが真ん中のあが被ってしまう為j-iと比べて小さい方を採用する必要がある
  do j = i+1, n
    ans = max(ans,min(j-i,z(j)))
  end do
end do

print"(I0)",ans

contains

function z_algorithm(s) result(z)
  character(*) :: s
  integer :: z(len_trim(s)), n, i, j, k
  z=0
  n=len_trim(S)
  z(1) = n
  i = 1
  j = 0
  do while (i < n)
    do while (i+j < n .and. s(j+1:j+1) == s(i+j+1:i+j+1))
      j = j+1
    end do
    z(i+1) = j
    if (j == 0) then
      i = i+1
      cycle
    end if
    k = 1
    do while (i+k < n .and. k + z(k+1) < j)
      z(i+k+1) = z(k+1)
      k = k+1
    end do
    i = i+k
    j = j-k
  end do
end function
end