local n = io.read("*n", "*l")
local s = io.read()
local mfl = math.floor
local maxlen = mfl(n / 2)
local found = false
local bt = {}
for i = 1, n do
  bt[i] = s:sub(i, i):byte() - 97
end

local function solve(len)
  if 6 <= len then
    local hlen = mfl(len / 2)
    local map = {}
    local hash = {}
    local tmap = {}
    local thash = {}
    thash[1]
      = bt[len - 5]
      + bt[len - 4] * 30
      + bt[len - 3] * 900
      + bt[len - 2] * 27000
      + bt[len - 1] * 810000
      + bt[len] * 24300000
    for k = 2, n - len + 1 do
      thash[k] = mfl(thash[k - 1] / 30) + bt[k + len - 1] * 24300000
    end
    for k = 1, n - len + 1 do
      tmap[k] = s:sub(k, k + len - 1)
    end
    local taskpos = n - len + 1
    for pos = n - len, len, -1 do
      -- map[tmap[pos + 1]] = true
      hash[thash[pos + 1]] = true
      if hash[thash[pos + 1 - len]] then
        for tmp = pos + 1, taskpos do
          map[tmap[tmp]] = true
          taskpos = pos
        end
        if map[tmap[pos + 1 - len]] then
          return true
        end
      end
    end
  else
    local map = {}
    local tmap = {}
    for k = 1, n - len + 1 do
      tmap[k] = s:sub(k, k + len - 1)
    end
    for pos = n - len, len, -1 do
      map[tmap[pos + 1]] = true
      if map[tmap[pos + 1 - len]] then
        return true
      end
    end
  end
  return false
end
if not solve(1) then
  print(0)
else
  local lmin, lmax = 1, maxlen + 1
  while 1 < lmax - lmin do
    local len = mfl((lmax + lmin) / 2)
    if solve(len) then
      lmin = len
    else
      lmax = len
    end
  end
  print(lmin)
end
