#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG1haW4oKSB7CglzdHJpbmcgczsKCWdldGxpbmUoY2luLHMpOyAvLyDQuNGB0L/QvtC70YzQt9GD0LXQvCDQtNCw0L3QvdGD0Y4g0YTRg9C90LrRhtC40Y4sINGC0LDQuiDQutCw0Log0Y3RgtC+INCy0YvQs9C+0LTQvdC+INC/0L4g0LLRgNC10LzQtdC90LgKCWludCBuID0gIHMubGVuZ3RoKCk7Cgl2ZWN0b3I8aW50PiB6IChuKTsvL9Cy0LXQutGC0L7RgCDQvdCwIG4g0Y3Qu9C10LzQtdGC0L7Qsiwg0LIg0LrQvtGC0L7RgNGL0Lkg0LHRg9C00YPRgiDQt9Cw0L/QuNGB0YvQstCw0YLRjNGPINC30L3QsNGH0LXQvdC40Y8g0LHQu9C+0LrQvtCyINGE0YPQvdC60YbQuNC4CglpbnQgbD0wLCByPTA7IC8v0LvQtdCy0LDRjyDQuCDQv9GA0LDQstCw0Y8g0LPRgNCw0L3QuNGG0LAgItC+0YLRgNC10LfQutCwINGB0L7QstC/0LDQtNC10L3QuNGPIgoJZm9yIChpbnQgaT0xOyBpPG47IGkrKykgeyAKCQlpZiAoaSA8PSByKQoJCQl6W2ldID0gbWluIChyLWkrMSwgeltpLWxdKTsKCQl3aGlsZSAoaSt6W2ldIDwgbiAmJiBzW3pbaV1dID09IHNbaSt6W2ldXSkKCQkJeltpXSsrOwoJCWlmIChpK3pbaV0tMSA+IHIpewoJCQlsID0gaTsKCQkJciA9IGkreltpXS0xOwoJCX0KCX0KCWludCBtYXg9elswXTsKCWZvciAoaW50IGk9MTsgaTx6LnNpemUoKTsgaSsrKXsKCQlpZiAobWF4PHpbaV0pewoJCQltYXg9eltpXTsKCQl9Cgl9Cgljb3V0PDxtYXg8PGVuZGw7CglyZXR1cm4gMDsKfQ==