import sys
sys.setrecursionlimit(10**6)
class node:
def __init__(self,s,l,p):
self.child={}
self.se=s
self.le=l
self.parent=p
self.val=0
def sufarr(s):
n=len(s)
o=[0]*n
o[0]=n-1
f=[0]*26
f[0]=1
for i in range(n-1):
f[ord(s[i])-65]+=1
for i in range(1,26):
f[i]+=f[i-1]
for i in range(n-2,-1,-1):
f[ord(s[i])-65]-=1
o[f[ord(s[i])-65]]=i
c=[0]*n
for i in range(1,n):
if(s[o[i]]==s[o[i-1]]):
c[o[i]]=c[o[i-1]]
else:
c[o[i]]=c[o[i-1]]+1
l=1
while(l<n):
f=[0]*n
for i in range(n):
f[c[i]]+=1
for i in range(1,n):
f[i]+=f[i-1]
od=[0]*n
for i in range(n-1,-1,-1):
pt=(o[i]-l)%n
f[c[pt]]-=1
od[f[c[pt]]]=pt
cd=[0]*n
for i in range(1,n):
x1=c[od[i]]
y1=c[(od[i]+l)%n]
x2=c[od[i-1]]
y2=c[(od[i-1]+l)%n]
if(x1==x2 and y1==y2):
cd[od[i]]=cd[od[i-1]]
else:
cd[od[i]]=cd[od[i-1]]+1
o=od[::]
c=cd[::]
l*=2
return o
def LCP(o):
n=len(o)
poso=[0]*n
for i in range(n):
poso[o[i]]=i
lc=0
lcp=[0]*(n-1)
s=o[0]
for i in range(n):
oi=poso[s]
if(oi == n-1):
lc=0
s=(s+1)%n
continue
ns=o[oi+1]
lc=lcpcal(s,ns,lc-1)
lcp[oi]=lc
s=(s+1)%n
return lcp
def lcpcal(i,j,k):
l=max(0,k)
while (i+l < len(st)) and (j+l < len(st)) :
if(st[i+l]==st[j+l]):
l+=1
else:
break
return l
def suftree():
a=node(-1,0,-1)
b=node(o[0],1,a)
a.child[st[o[0]]]=b
t=a
a=b
r=1
for i in range(1,n):
x=lcp[i-1]
y=o[i]
while(r>x):
r-=a.le
a=a.parent
if(r==x):
b=node(y+x,n-(y+x),a)
a.child[st[y+x]]=b
a=b
else:
q=x-r
k=a.child[st[y+r]]
w1=node(k.se,q,a)
w2=node(y+x,n-(x+y),w1)
k.se=w1.se+q
k.le-=q
k.parent=w1
w1.child[st[k.se]]=k
w1.child[st[w2.se]]=w2
del a.child[st[y+r]]
a.child[st[w1.se]]=w1
a=w2
r=n-y
return t
def dfs(x):
if(len(x.child)==0):
x.val=x.le-1
else:
x.val=x.le
for i in x.child:
x.val+=dfs(x.child[i])
return x.val
st=list(raw_input())
st.append("$")
n=len(st)
o=sufarr(st)
lcp=LCP(o)
t=suftree() #t stores the address of root node of the suffix tree
aW1wb3J0IHN5cwpzeXMuc2V0cmVjdXJzaW9ubGltaXQoMTAqKjYpCmNsYXNzIG5vZGU6CiAgICBkZWYgX19pbml0X18oc2VsZixzLGwscCk6CiAgICAgICAgc2VsZi5jaGlsZD17fQogICAgICAgIHNlbGYuc2U9cwogICAgICAgIHNlbGYubGU9bAogICAgICAgIHNlbGYucGFyZW50PXAKICAgICAgICBzZWxmLnZhbD0wCmRlZiBzdWZhcnIocyk6CiAgICBuPWxlbihzKQogICAgbz1bMF0qbgogICAgb1swXT1uLTEKICAgIGY9WzBdKjI2CiAgICBmWzBdPTEKICAgIGZvciBpIGluIHJhbmdlKG4tMSk6CiAgICAgICAgZltvcmQoc1tpXSktNjVdKz0xCiAgICBmb3IgaSBpbiByYW5nZSgxLDI2KToKICAgICAgICBmW2ldKz1mW2ktMV0KICAgIGZvciBpIGluIHJhbmdlKG4tMiwtMSwtMSk6CiAgICAgICAgZltvcmQoc1tpXSktNjVdLT0xCiAgICAgICAgb1tmW29yZChzW2ldKS02NV1dPWkKICAgIGM9WzBdKm4KICAgIGZvciBpIGluIHJhbmdlKDEsbik6CiAgICAgICAgaWYoc1tvW2ldXT09c1tvW2ktMV1dKToKICAgICAgICAgICAgY1tvW2ldXT1jW29baS0xXV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBjW29baV1dPWNbb1tpLTFdXSsxCiAgICBsPTEKICAgIHdoaWxlKGw8bik6CiAgICAgICAgZj1bMF0qbgogICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgogICAgICAgICAgICBmW2NbaV1dKz0xCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSxuKToKICAgICAgICAgICAgZltpXSs9ZltpLTFdCiAgICAgICAgb2Q9WzBdKm4KICAgICAgICBmb3IgaSBpbiByYW5nZShuLTEsLTEsLTEpOgogICAgICAgICAgICBwdD0ob1tpXS1sKSVuCiAgICAgICAgICAgIGZbY1twdF1dLT0xCiAgICAgICAgICAgIG9kW2ZbY1twdF1dXT1wdAogICAgICAgIGNkPVswXSpuCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSxuKToKICAgICAgICAgICAgeDE9Y1tvZFtpXV0KICAgICAgICAgICAgeTE9Y1sob2RbaV0rbCklbl0KICAgICAgICAgICAgeDI9Y1tvZFtpLTFdXQogICAgICAgICAgICB5Mj1jWyhvZFtpLTFdK2wpJW5dCiAgICAgICAgICAgIGlmKHgxPT14MiBhbmQgeTE9PXkyKToKICAgICAgICAgICAgICAgIGNkW29kW2ldXT1jZFtvZFtpLTFdXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgY2Rbb2RbaV1dPWNkW29kW2ktMV1dKzEKICAgICAgICBvPW9kWzo6XQogICAgICAgIGM9Y2RbOjpdCiAgICAgICAgbCo9MgogICAgcmV0dXJuIG8KZGVmIExDUChvKToKICAgIG49bGVuKG8pCiAgICBwb3NvPVswXSpuCiAgICBmb3IgaSBpbiByYW5nZShuKToKICAgICAgICBwb3NvW29baV1dPWkKICAgIGxjPTAKICAgIGxjcD1bMF0qKG4tMSkKICAgIHM9b1swXQogICAgZm9yIGkgaW4gcmFuZ2Uobik6CiAgICAgICAgb2k9cG9zb1tzXQogICAgICAgIGlmKG9pID09IG4tMSk6CiAgICAgICAgICAgIGxjPTAKICAgICAgICAgICAgcz0ocysxKSVuCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgbnM9b1tvaSsxXQogICAgICAgIGxjPWxjcGNhbChzLG5zLGxjLTEpCiAgICAgICAgbGNwW29pXT1sYwogICAgICAgIHM9KHMrMSklbgogICAgcmV0dXJuIGxjcApkZWYgbGNwY2FsKGksaixrKToKICAgIGw9bWF4KDAsaykKICAgIHdoaWxlIChpK2wgPCBsZW4oc3QpKSBhbmQgKGorbCA8IGxlbihzdCkpIDoKICAgICAgICBpZihzdFtpK2xdPT1zdFtqK2xdKToKICAgICAgICAgICAgbCs9MQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJyZWFrCiAgICByZXR1cm4gbApkZWYgc3VmdHJlZSgpOgogICAgYT1ub2RlKC0xLDAsLTEpCiAgICBiPW5vZGUob1swXSwxLGEpCiAgICBhLmNoaWxkW3N0W29bMF1dXT1iCiAgICB0PWEKICAgIGE9YgogICAgcj0xCiAgICBmb3IgaSBpbiByYW5nZSgxLG4pOgogICAgICAgIHg9bGNwW2ktMV0KICAgICAgICB5PW9baV0KICAgICAgICB3aGlsZShyPngpOgogICAgICAgICAgICByLT1hLmxlCiAgICAgICAgICAgIGE9YS5wYXJlbnQKICAgICAgICBpZihyPT14KToKICAgICAgICAgICAgYj1ub2RlKHkreCxuLSh5K3gpLGEpCiAgICAgICAgICAgIGEuY2hpbGRbc3RbeSt4XV09YgogICAgICAgICAgICBhPWIKICAgICAgICBlbHNlOgogICAgICAgICAgICBxPXgtcgogICAgICAgICAgICBrPWEuY2hpbGRbc3RbeStyXV0KICAgICAgICAgICAgdzE9bm9kZShrLnNlLHEsYSkKICAgICAgICAgICAgdzI9bm9kZSh5K3gsbi0oeCt5KSx3MSkKICAgICAgICAgICAgay5zZT13MS5zZStxCiAgICAgICAgICAgIGsubGUtPXEKICAgICAgICAgICAgay5wYXJlbnQ9dzEKICAgICAgICAgICAgdzEuY2hpbGRbc3Rbay5zZV1dPWsKICAgICAgICAgICAgdzEuY2hpbGRbc3RbdzIuc2VdXT13MgogICAgICAgICAgICBkZWwgYS5jaGlsZFtzdFt5K3JdXQogICAgICAgICAgICBhLmNoaWxkW3N0W3cxLnNlXV09dzEKICAgICAgICAgICAgYT13MgogICAgICAgIHI9bi15CiAgICByZXR1cm4gdApkZWYgZGZzKHgpOgogICAgaWYobGVuKHguY2hpbGQpPT0wKToKICAgICAgICB4LnZhbD14LmxlLTEKICAgIGVsc2U6CiAgICAgICAgeC52YWw9eC5sZQogICAgZm9yIGkgaW4geC5jaGlsZDoKICAgICAgICB4LnZhbCs9ZGZzKHguY2hpbGRbaV0pCiAgICByZXR1cm4geC52YWwKc3Q9bGlzdChyYXdfaW5wdXQoKSkKc3QuYXBwZW5kKCIkIikKbj1sZW4oc3QpCm89c3VmYXJyKHN0KQpsY3A9TENQKG8pCnQ9c3VmdHJlZSgpICN0IHN0b3JlcyB0aGUgYWRkcmVzcyBvZiByb290IG5vZGUgb2YgdGhlIHN1ZmZpeCB0cmVlCg==