Problem:
Score : 200 points

Problem Statement

You are going to take the entrance examination of Kyoto University tomorrow
and have decided to memorize a set of strings S that is expected to appear in the examination.
Since it is really tough to memorize S as it is,
you have decided to memorize a single string T that efficiently contains all the strings in S.

You have already confirmed the following conditions for S and T are satisfied.

Every string in S is a consecutive subsequence(1) in T .

For every pair of strings x, y (x \neq y) in S ,
x is not a subsequence(2) of y.

Note that (1) is ''consecutive subsequence'', while (2) is ''subsequence''.

The next day, you opened the problem booklet at the examination
and found that you can get a full score only if you remember S.
However, You have forgot how to reconstruct S from T .
Since all you remember is that T satisfies the above conditions,
first you have decided to find the maximum possible number of elements in S .

Constraints

1 \leq |T| \leq 10^5

T consists of only lowercase letters.

Partial points

30 points will be awarded for passing the test set satisfying the condition: 1 \leq |T| \leq 50 .

Another 30 points will be awarded for passing the test set satisfying the condition: 1 \leq |T| \leq 10^3.

Input

The input is given from Standard Input in the following format:

T

The input only consists of T on one line.

Output

Print the maximum number of elements inS .

Sample Input 1

abcabc

Sample Output 1

3

In this case, ab，ca and bc are an example of the optimum answers.

Sample Input 2

abracadabra

Sample Output 2

7

Sample Input 3

abcbabbcabbc

Sample Output 3

8

Sample Input 4

bbcacbcbcabbabacccbbcacbaaababbacabaaccbccabcaabba

Sample Output 4

44

Solution in C++14 (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>	
#include<map>
#include<set>
#include<utility>
#include<cmath>
#include<cstring>
#include<queue>
#include<cstdio>
#include<sstream>
#include<iomanip>
#define loop(i,a,b) for(int i=a;i<b;i++) 
#define rep(i,a) loop(i,0,a)
#define pb push_back
#define mp make_pair
#define all(in) in.begin(),in.end()
#define shosu(x) fixed<<setprecision(x)
using namespace std;
//kaewasuretyuui
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<pii> vp;
typedef vector<vp> vvp;
typedef pair<int,pii> pip;
typedef vector<pip>vip;
const double PI=acos(-1);
const double EPS=1e-8;
const int inf=1e8;
ll MOD1=134832894;
ll MOD2=183489237;
ll x1=52452452;
ll x2=34567343;
int main(){
	string s;
	cin>>s;
	int n=s.size();
	vector<ll>X1(n+1),X2(n+1);
	X1[0]=X2[0]=1;
	rep(i,n){
		X1[i+1]=(X1[i]*x1)%MOD1;
		X2[i+1]=(X2[i]*x2)%MOD2;
	}
	vector<ll>hash1(n+1),hash2(n+1);
	rep(i,n){
		hash1[i+1]=(s[i]-'a')*X1[i+1];
		hash2[i+1]=(s[i]-'a')*X2[i+1];
	}
	rep(i,n){
		hash1[i+1]=(hash1[i+1]+hash1[i])%MOD1;
		hash2[i+1]=(hash2[i+1]+hash2[i])%MOD2;
	}
	
//	rep(i,n+1)cout<<hash1[i]<<endl;
	int out=0;
	rep(i,n){
		set<pair<ll,ll> >se;
		rep(j,n-i){
			ll a1=(hash1[i+j+1]-hash1[j]+MOD1)%MOD1*X1[n-(i+j+1)]%MOD1;
			ll a2=(hash2[i+j+1]-hash2[j]+MOD2)%MOD2*X2[n-(i+j+1)]%MOD2;
//			cout<<a1<<" "<<a2<<endl;
			se.insert(pair<ll,ll>(a1,a2));
		}
		int t=se.size();
//		cout<<i<<" "<<t<<endl;
		if(out>t)break;
		else out=t;
	}
	cout<<out<<endl;
}