#include <bits/stdc++.h>
#pragma comment(linker, "/stack:102400000,102400000")
using namespace std;
int f_abs(int x) { return x < 0 ? -x : x; }
int lowbit(int x) { return (x & -x); }
int f_max(int a, int b) { return a > b ? a : b; }
int f_min(int a, int b) { return a < b ? a : b; }
int gcd(int a, int b) {
  while (int t = a % b) a = b, b = t;
  return b;
}
bool isdig(char ch) { return ch >= '0' && ch <= '9'; }
bool isup(char ch) { return ch >= 'A' && ch <= 'Z'; }
bool islow(char ch) { return ch >= 'a' && ch <= 'z'; }
const int N = 103;
struct node {
  string str;
  int len;
} nd[N * N];
char s[N];
bool cmp(node A, node B) { return A.str < B.str; }
void solve() {
  int i, j, k, ans = 0, tot = 0, len = strlen(s);
  for (i = 0; i < len; ++i) {
    for (j = i; j < len; ++j) {
      nd[tot].str = "";
      nd[tot].len = 0;
      for (k = i; k <= j; ++k) {
        nd[tot].str += s[k];
        nd[tot].len++;
      }
      tot++;
    }
  }
  sort(nd, nd + tot, cmp);
  for (i = 1; i < tot; ++i) {
    if (nd[i].str == nd[i - 1].str) {
      ans = f_max(ans, nd[i].len);
    }
  }
  printf("%d\n", ans);
}
int main() {
  while (gets(s) != NULL) {
    solve();
  }
  return 0;
}
