using namespace std;
int wa[N],wb[N],wv[N],ws[N];
int sa[N],rk[N],height[N];
char s[N];
void da(int n)
{
int i,j,p,*x=wa,*y=wb,m=128;
for(i=0;i<m;i++)ws[i]=0;
for(i=0;i<n;i++)ws[x[i]=s[i]]++;
for(i=1;i<m;i++)ws[i]+=ws[i-1];
for(i=n-1;i>=0;i--)sa[--ws[x[i]]]=i;
for(j=1,p=1;p<n;j*=2,m=p){
for(p=0,i=n-j;i<n;i++)y[p++]=i;
for(i=0;i<n;i++)if(sa[i]>=j)y[p++]=sa[i]-j;
for(i=0;i<n;i++)wv[i]=x[y[i]];
for(i=0;i<m;i++)ws[i]=0;
for(i=0;i<n;i++)ws[wv[i]]++;
for(i=1;i<m;i++)ws[i]+=ws[i-1];
for(i=n-1;i>=0;i--)sa[--ws[wv[i]]]=y[i];
for(swap(x,y),p=1,x[sa[0]]=0,i=1;i<n;i++)
x[sa[i]]=(y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+j]==y[sa[i]+j])?p-1:p++;
}
}
void calheight(int n)
{
int i,j,k=0;
for(i=1;i<=n;i++)rk[sa[i]]=i;
for(i=0;i<n;height[rk[i++]]=k)
for(k?k--:0,j=sa[rk[i]-1];s[i+k]==s[j+k];k++);
}
int lcp[N][32];
void init(int n)
{
for(int i=1;i<=n;i++)lcp[i][0]=height[i];
for(int i=1;(1<<i)<=n;i++)
for(int j=1;j+(1<<i)-1<=n;j++)
lcp[j][i]=min(lcp[j][i-1],lcp[j+(1<<i-1)][i-1]);
}
int LCP(int a,int b)
{
a--;b--;
int l=min(rk[a],rk[b])+1,r=max(rk[a],rk[b]);
int len=r-l+1,i;
for(i=0;(1<<i)<=len;i++);
i--;
return min(lcp[l][i],lcp[r-(1<<i)+1][i]);
}
int get(int n)
{
int ans=0;
for(int l=1;l<=n;l++)
for(int i=1;i+l<=n;i+=l){
int r=LCP(i,i+l);
ans=max(ans,r/l+1);
if(i-l+r%l>0)
ans=max(ans,LCP(i-l+r%l,i+r%l)/l+1);
}
return ans;
}
int main()
{
scanf("%s",s);
int n=strlen(s);
da(n+1);
calheight(n);
init(n);
printf("%d\n",get(n));
}