def get_cache(chars, start, end, cache=dict()):
    pair = (start, end)
    block = cache.get(pair)
    if block is not None:
        return block
    else:
        block = chars[start:end]
        cache[pair] = block
        return block


def count_k(chars, previous_start, previous_end):
    skip = len(chars)
    previous_len = previous_end - previous_start
    if previous_end + previous_len < len(chars):
        previous = get_cache(chars, previous_start, previous_end)
        suspicious_end = previous_end + previous_len
        suspicious = get_cache(chars, previous_end, previous_end + previous_len)
        if previous == suspicious:
            skip = suspicious_end

    max_k = 1
    for n in range(previous_end + 1, len(chars)):
        if n == skip:
            continue
        k = count_k(chars, previous_end, n) + 1
        if k == 1:
            continue
        if max_k >= k:
            break
        else:
            max_k = k
    return max_k


s = input()
print(count_k(list(s), 0, 0))