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 thash = {}
if 6 <= n then
  thash[1]
    = bt[1]
    + bt[2] * 30
    + bt[3] * 900
    + bt[4] * 27000
    + bt[5] * 810000
    + bt[6] * 24300000
  for k = 2, n - 5 do
    thash[k] = mfl(thash[k - 1] / 30) + bt[k + 5] * 24300000
  end
end

local function solve(len)
  if 6 <= len then
    local hlen = mfl(len / 2)
    local map = {}
    local hash = {}
    local tmap = {}
    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
      hash[thash[pos + len - 5]] = true
      if hash[thash[pos - 5]] then
        for tmp = pos + 1, taskpos do
          map[tmap[tmp]] = true
        end
        taskpos = pos
        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
