using namespace std;
#include <cstdio>
#include <cstdlib>
#include <string>
#define maxn 140001
#define maxlg 20
char x[maxn];
int n;
struct nod { int nr[2], p;};
nod A[maxn],b[maxn];
int P[maxlg][maxn];
char *sarray[maxn];
//int P1[maxn], P2[maxn];
struct cmp{
bool operator()(const nod &a, const nod &b)const
{
if(a.nr[0]<b.nr[0]) return 1;
if(a.nr[0]==b.nr[0] && a.nr[1]<b.nr[1]) return 1;
return 0;
}
};
bool operator<(const nod &a, const nod &b)
{
if(a.nr[0]<b.nr[0]) return 1;
if(a.nr[0]==b.nr[0] && a.nr[1]<b.nr[1]) return 1;
return 0;
}
struct comp{
bool operator()(const nod &a, const nod &b)const
{
if(a.nr[1]<b.nr[1])return 1;
return 0;
}
};
void read()
{
freopen("sarray.in","r",stdin);
gets(x);
n=strlen(x);
}
inline void rad(int byte, int n, nod a[], nod b[])
{
int count[1024], index[1024],i;
memset(count, 0, sizeof(count));
for(i=0;i<n;++i) ++count[(a[i].nr[0]>>byte)&1023];
index[0]=0;
for(i=1;i<1024;++i) index[i]=index[i-1]+count[i-1];
for(i=0;i<n;++i) b[index[(a[i].nr[0]>>byte)&1023]++]=a[i];
}
inline void radix()
{
int p=0, i;
//nod b[maxn];
rad(0, n, A, b);
rad(10, n, b, A);
//rad(, n, A, b);
// rad(24, n, b, A);
// for(i=0;i<n;++i) A[i]=b[i];
for(i=1;i<n;++i)
if(A[i].nr[0]==A[i-1].nr[0]) ;
else
{
if(i-1!=p) sort(A+p, A+i, comp());
p=i;
}
if(i-1!=p) sort(A+p, A+i, comp());
}
inline void radix2()
{
int count[maxn],index[maxn];
int i;
index[0]=0;
nod b[maxn];
memset(count, 0,sizeof(count));
for(i=0;i<n;++i) ++count[A[i].nr[0]];
for(i=1;i<maxn;++i) index[i]=index[i-1]+count[i-1];
for(i=0;i<n;++i) b[index[A[i].nr[0]]++]=A[i];
for(i=0;i<n;++i) A[i]=b[i];
int p=0;
for(i=1;i<n;++i)
if(A[i].nr[0]==A[i-1].nr[0]) ;
else
{
if(i-1!=p) sort(A+p, A+i, comp());
p=i;
}
if(i-1!=p) sort(A+p, A+i, comp());
}
void sortarrays()
{
int i, j, cnt,stp;
for(i=0;i<n;++i) P[0][i]=x[i];
for(cnt=1, stp=1; cnt>>1<n; cnt<<=1, ++stp)
{
for(i=0;i<n;++i)
A[i].nr[0]=P[stp-1][i],
A[i].nr[1]=i+cnt<n?P[stp-1][i+cnt]:-1,
A[i].p=i;
//sort(A, A+n,cmp());
//radix2();
radix();
for(i=0;i<n;++i)
P[stp][A[i].p]=i>0 && A[i].nr[0]==A[i-1].nr[0] && A[i].nr[1]==A[i-1].nr[1] ? P[stp][A[i-1].p]:i;
}
for(i=0;i<n;++i)
sarray[P[stp-1][i]]=x+i;
}
/*
void sortarrays2()
{
int i, j, cnt;
for(i=0;i<n;++i) P1[i]=x[i];
for(cnt=1; cnt>>1<n; cnt<<=1)
{
for(i=0;i<n;++i)
A[i].nr[0]=P1[i],
A[i].nr[1]=i+cnt<n?P1[i+cnt]:-1,
A[i].p=i;
// sort(A, A+n,cmp());
//radix2();
radix();
for(i=0;i<n;++i)
P2[A[i].p]=i>0 && A[i].nr[0]==A[i-1].nr[0] && A[i].nr[1]==A[i-1].nr[1] ? P2[A[i-1].p]:i;
for(i=0;i<n;++i) P1[i]=P2[i];
// memcpy(P1, P2, sizeof(nod)*(n+2));
// memset(P2, 0, sizeof(nod)*(n+2));
}
for(i=0;i<n;++i)
sarray[P1[i]]=x+i;
}
*/
void make_random()
{
#include <ctime>
srand(time(0));
int i;
n=100000;
char c;
for(i=0,c='a';i<n;++i,++c) { if(c=='z')c='a';x[i]=c;}
}
int main()
{
//read();
make_random();
sortarrays();
// radix();
int ok=1;
//for(int i=1;i<n;++i) if(strcmp(sarray[i-1], sarray[i])>0) ok=0;
printf("%d\n", ok);
// for(int i=0;i<n;++i) printf("%s\n", sarray[i]);
return 0;
}