Problem:
Score : 500 points

Problem Statement

Given is a string S of length N.

Find the maximum length of a non-empty string that occurs twice or more in S as contiguous substrings without overlapping.

More formally, find the maximum positive integer len such that there exist integers l_1 and l_2 ( 1 \leq l_1, l_2 \leq N - len + 1 ) that satisfy the following:

l_1 + len \leq l_2

S[l_1+i] = S[l_2+i] (i = 0, 1, ..., len - 1)

If there is no such integer len, print 0.

Constraints

2 \leq N \leq 5 \times 10^3

|S| = N

S consists of lowercase English letters.

Input

Input is given from Standard Input in the following format:

N
S

Output

Print the maximum length of a non-empty string that occurs twice or more in S as contiguous substrings without overlapping. If there is no such non-empty string, print 0 instead.

Sample Input 1

5
ababa

Sample Output 1

2

The strings satisfying the conditions are: a, b, ab, and ba. The maximum length among them is 2, which is the answer.
Note that aba occurs twice in S as contiguous substrings, but there is no pair of integers l_1 and l_2 mentioned in the statement such that l_1 + len \leq l_2.

Sample Input 2

2
xy

Sample Output 2

0

No non-empty string satisfies the conditions.

Sample Input 3

13
strangeorange

Sample Output 3

5

Solution in Fortran (gfortran v4.8.4) (judge verdict: Time Limit Exceeded)

program who_says_a_pun
  implicit none
  integer :: n, i, j, ans = 0, cntl(26) = 0, cntr(26) = 0
  character(5000) :: s
  read(*,*) n
  read(*,*) s
  do i = 1, n
    j = ord(s(i:i))
    cntr(j) = cntr(j)+1
  end do
  do i = 1, n-1
    j = ord(s(i:i))
    cntr(j) = cntr(j)-1
    cntl(j) = cntl(j)+1
    if (cntr(j)-cntl(j) < -1) cycle
    ans = max(ans,lcs(s(1:i),s(i+1:n)))
  end do
  write(*,'(i0)') ans
contains
  integer function ord(s)
    character(1), intent(in) :: s
    ord = ichar(s)-96
  end
  function lcs(s,t) result(ret)
    character(*), intent(in) :: s, t
    integer :: n, m, i, j, ret
    integer, allocatable :: dp(:,:)
    n = len_trim(s)
    m = len_trim(t)
    allocate(dp(0:n,0:m))
    dp = 0
    do i = 1, n
      do j = 1, m
        if (s(i:i) == t(j:j)) then
          dp(i,j) = dp(i-1,j-1)+1
        else
          dp(i,j) = max(dp(i-1,j),dp(i,j-1))
        end if
      end do
    end do
    ret = dp(n,m)
  end 
end program who_says_a_pun