#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<fstream>
#include<map>
#include<ctime>
#include<set>
#include<queue>
#include<cmath>
#include<vector>
#include<bitset>
#include<functional>
#define x first
#define y second
#define mp make_pair
#define pb push_back
#define REP(i,l,r) for((i)=(l);(i)<=(r);++(i))
#define REP2(i,l,r) for((i)=(l);(i)!=(r);++(i))
using namespace std;
typedef long long LL;
typedef double ld;
const int MAX=1000000+10;
int len;
char a[MAX];
int L[MAX],pre[MAX],suf[MAX];
int num[MAX],diff=1;
int cmp(int a,int b)
{
return L[a]<L[b];
}
void del(int u)
{
if(pre[u]!=-1)
suf[pre[u]]=suf[u];
if(suf[u]!=len)
pre[suf[u]]=pre[u];
diff=max(diff,suf[u]-pre[u]);
}
int main()
{
// freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);
int i;
scanf("%s",a);
len=strlen(a);
L[0]=0;
int last=0;
for(i=0;i<len;++i)
{
L[i]=-1;
if(last+L[last]>=i && L[last]!=-1)
L[i]=min(last+L[last]-i,L[i-last]);
for(;i+L[i]+1<len && a[ i+L[i]+1 ] == a[ L[i] + 1 ];++L[i])
;
if(i+L[i]>last+L[last] || last==0)
last=i;
pre[i]=i-1;
suf[i]=i+1;
num[i]=i;
}
sort(num,num+len,cmp);
for(i=0;i<len;)
{
int x=L[num[i]];
if(x!=-1 && diff<=x+1)
{
cout<<x+1<<endl;
break;
}
for(;i<len && L[num[i]]==x;++i)
del(num[i]);
}
return 0;
}
I2luY2x1ZGU8Y3N0ZGlvPgojaW5jbHVkZTxjc3RkbGliPgojaW5jbHVkZTxjc3RyaW5nPgojaW5jbHVkZTxhbGdvcml0aG0+CiNpbmNsdWRlPGlvc3RyZWFtPgojaW5jbHVkZTxmc3RyZWFtPgojaW5jbHVkZTxtYXA+CiNpbmNsdWRlPGN0aW1lPgojaW5jbHVkZTxzZXQ+CiNpbmNsdWRlPHF1ZXVlPgojaW5jbHVkZTxjbWF0aD4KI2luY2x1ZGU8dmVjdG9yPgojaW5jbHVkZTxiaXRzZXQ+CiNpbmNsdWRlPGZ1bmN0aW9uYWw+CiNkZWZpbmUgeCBmaXJzdAojZGVmaW5lIHkgc2Vjb25kCiNkZWZpbmUgbXAgbWFrZV9wYWlyCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgUkVQKGksbCxyKSBmb3IoKGkpPShsKTsoaSk8PShyKTsrKyhpKSkKI2RlZmluZSBSRVAyKGksbCxyKSBmb3IoKGkpPShsKTsoaSkhPShyKTsrKyhpKSkKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnR5cGVkZWYgbG9uZyBsb25nIExMOwp0eXBlZGVmIGRvdWJsZSBsZDsKCmNvbnN0IGludCBNQVg9MTAwMDAwMCsxMDsKCmludCBsZW47CmNoYXIgYVtNQVhdOwppbnQgTFtNQVhdLHByZVtNQVhdLHN1ZltNQVhdOwppbnQgbnVtW01BWF0sZGlmZj0xOwoKaW50IGNtcChpbnQgYSxpbnQgYikKewoJcmV0dXJuIExbYV08TFtiXTsKfQoKdm9pZCBkZWwoaW50IHUpCnsKCWlmKHByZVt1XSE9LTEpCgkJc3VmW3ByZVt1XV09c3VmW3VdOwoJaWYoc3VmW3VdIT1sZW4pCgkJcHJlW3N1Zlt1XV09cHJlW3VdOwoJZGlmZj1tYXgoZGlmZixzdWZbdV0tcHJlW3VdKTsKfQoKaW50IG1haW4oKQp7Ci8vCWZyZW9wZW4oImlucHV0LnR4dCIsInIiLHN0ZGluKTtmcmVvcGVuKCJvdXRwdXQudHh0IiwidyIsc3Rkb3V0KTsKCWludCBpOwoJc2NhbmYoIiVzIixhKTsKCWxlbj1zdHJsZW4oYSk7CglMWzBdPTA7CglpbnQgbGFzdD0wOwoJZm9yKGk9MDtpPGxlbjsrK2kpCgl7CgkJTFtpXT0tMTsKCQlpZihsYXN0K0xbbGFzdF0+PWkgJiYgTFtsYXN0XSE9LTEpCgkJCUxbaV09bWluKGxhc3QrTFtsYXN0XS1pLExbaS1sYXN0XSk7CgkJZm9yKDtpK0xbaV0rMTxsZW4gJiYgYVsgaStMW2ldKzEgXSA9PSBhWyBMW2ldICsgMSBdOysrTFtpXSkKCQkJOwoJCWlmKGkrTFtpXT5sYXN0K0xbbGFzdF0gfHwgbGFzdD09MCkKCQkJbGFzdD1pOwoJCXByZVtpXT1pLTE7CgkJc3VmW2ldPWkrMTsKCQludW1baV09aTsKCX0KCXNvcnQobnVtLG51bStsZW4sY21wKTsKCWZvcihpPTA7aTxsZW47KQoJewoJCWludCB4PUxbbnVtW2ldXTsKCQlpZih4IT0tMSAmJiBkaWZmPD14KzEpCgkJewoJCQljb3V0PDx4KzE8PGVuZGw7CgkJCWJyZWFrOwoJCX0KCQlmb3IoO2k8bGVuICYmIExbbnVtW2ldXT09eDsrK2kpCgkJCWRlbChudW1baV0pOwoJfQoJcmV0dXJuIDA7Cn0K