program who_says_a_pun
  implicit none
  integer :: n, i, j, ans = 0, z(5000) = 0
  character(5000) :: s
  read(*,*) n
  read(*,*) s
  do i = 1, n
    z(1:n-i+1) = z_algorithm(s(i:n))
    do j = 2, n-i+1
      ans = max(ans,min(j-1,z(j)))
    end do
  end do
  write(*,'(i0)') ans
contains
  function z_algorithm(s) result(z)
    implicit none
    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
end program who_says_a_pun