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 Python (3.4.3) (judge verdict: Time Limit Exceeded)

#! /usr/bin/env python3

### @file wsap.py
### @brief
### @author Yusuke Matsunaga (松永 裕介)
###
### Copyright (C) 2019 Yusuke Matsunaga
### All rights reserved.

def Z_algorithm(S) :
    n = len(S)
    A = [ 0 for i in range(n) ]
    A[0] = n
    i = 1
    j = 0
    max_val = 0
    while i < n :
        while (i + j) < n and S[j] == S[i + j] :
            j += 1
        A[i] = j
        if j <= i and max_val < j :
            max_val = j
        if j == 0 :
            i += 1
            continue
        k = 1
        while (i + k) < n and k + A[k] < j :
            A[i + k] = A[k]
            k += 1
        i += k
        j -= k

    return max_val


def wsap(S) :
    n = len(S)
    max_len = 0
    for i in range(n) :
        val = Z_algorithm(S[i:])
        if max_len < val :
            max_len = val
    return max_len


if __name__ == '__main__' :

    n = int(input())
    S = input()
    max_len = wsap(S)
    print(max_len)