#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
	string s;
	getline(cin,s); // используем данную функцию, так как это выгодно по времени
	int n =  s.length();
	vector<int> z (n);//вектор на n элеметов, в который будут записыватья значения блоков функции
	int l=0, r=0; //левая и правая граница "отрезка совпадения"
	for (int i=1; i<n; i++) { 
		if (i <= r)
			z[i] = min (r-i+1, z[i-l]);
		while (i+z[i] < n && s[z[i]] == s[i+z[i]])
			z[i]++;
		if (i+z[i]-1 > r){
			l = i;
			r = i+z[i]-1;
		}
	}
	int max=z[0];
	for (int i=1; i<z.size(); i++){
		if (max<z[i]){
			max=z[i];
		}
	}
	cout<<max<<endl;
	return 0;
}