#include <iostream>
#include <cstdio>
using namespace std;
int recurse(string s, int **arr, int n, int i, int j)
{
if(i < 0 || j >= n)return 0;
if(arr[i][j] != -1)return arr[i][j];
if(s[i] == s[j]){ arr[i][j] = 1 + recurse(s,arr,n,i-1,j+1); return arr[i][j];}
// otherwise s[i] != s[j]
arr[i][j] = 0;
return arr[i][j];
}
int findLongestRepeated(string s, int **arr, int n)
{
int answer = 0;
for(int i = 0 ; i < n ; ++i)
{
for(int j = i + 1 ; j < n ; ++j)
{
if(arr[i][j] == -1)
arr[i][j] = recurse(s,arr,n,i,j); //this assignment happens anyway in the function recurse.
answer = max(answer,arr[i][j]);
}
}
return answer;
}
int main()
{
string inp;
cin>> inp;
int len = inp.length();
int **table = new int*[len+1];
for(int i = 0 ; i <= len ; ++i)
{
table[i] = new int[len+1];
for(int j = 0 ; j <= len ; ++j)
table[i][j] = -1;
}
cout<<findLongestRepeated(inp,table,len)<<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGlvPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCByZWN1cnNlKHN0cmluZyBzLCBpbnQgKiphcnIsIGludCBuLCBpbnQgaSwgaW50IGopCgp7CiAgICBpZihpIDwgMCB8fCBqID49IG4pcmV0dXJuIDA7CgogICAgaWYoYXJyW2ldW2pdICE9IC0xKXJldHVybiBhcnJbaV1bal07CgogICAgaWYoc1tpXSA9PSBzW2pdKXsgYXJyW2ldW2pdID0gMSArIHJlY3Vyc2UocyxhcnIsbixpLTEsaisxKTsgcmV0dXJuIGFycltpXVtqXTt9CgogICAgLy8gb3RoZXJ3aXNlIHNbaV0gIT0gc1tqXQogICAgYXJyW2ldW2pdID0gMDsKICAgIHJldHVybiBhcnJbaV1bal07Cn0KCmludCBmaW5kTG9uZ2VzdFJlcGVhdGVkKHN0cmluZyBzLCBpbnQgKiphcnIsIGludCBuKQoKewogICAgaW50IGFuc3dlciA9IDA7CgogICAgZm9yKGludCBpID0gMCA7IGkgPCBuIDsgKytpKQogICAgewogICAgICAgIGZvcihpbnQgaiA9IGkgKyAxIDsgaiA8IG4gOyArK2opCiAgICAgICAgewogICAgICAgICAgICBpZihhcnJbaV1bal0gPT0gLTEpCiAgICAgICAgICAgICAgICBhcnJbaV1bal0gPSByZWN1cnNlKHMsYXJyLG4saSxqKTsgLy90aGlzIGFzc2lnbm1lbnQgaGFwcGVucyBhbnl3YXkgaW4gdGhlIGZ1bmN0aW9uIHJlY3Vyc2UuCgogICAgICAgICAgICBhbnN3ZXIgPSBtYXgoYW5zd2VyLGFycltpXVtqXSk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBhbnN3ZXI7Cn0KCmludCBtYWluKCkKewogICAgc3RyaW5nIGlucDsKICAgIGNpbj4+IGlucDsKCiAgICBpbnQgbGVuID0gaW5wLmxlbmd0aCgpOwoKICAgIGludCAqKnRhYmxlID0gbmV3IGludCpbbGVuKzFdOwoKICAgIGZvcihpbnQgaSA9IDAgOyBpIDw9IGxlbiA7ICsraSkKICAgIHsKICAgICAgICB0YWJsZVtpXSA9IG5ldyBpbnRbbGVuKzFdOwogICAgICAgIGZvcihpbnQgaiA9IDAgOyBqIDw9IGxlbiA7ICsraikKICAgICAgICAgICAgdGFibGVbaV1bal0gPSAtMTsKICAgIH0KCiAgICBjb3V0PDxmaW5kTG9uZ2VzdFJlcGVhdGVkKGlucCx0YWJsZSxsZW4pPDxlbmRsOwoKICAgIHJldHVybiAwOwp9Cg==