#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int max_n = 1e5 + 5;
int n, m = 0;
char s[max_n];
int Rank[max_n], Sa[max_n], Height[max_n], tax[max_n], tp[max_n];
void Rank_Sort() {
for (int i = 0; i <= m; i++)tax[i] = 0;
for (int i = 1; i <= n; i++)tax[Rank[tp[i]]]++;
for (int i = 1; i <= m; i++)tax[i] += tax[i - 1];
for (int i = n; i >= 1; i--)Sa[tax[Rank[tp[i]]]--] = tp[i];
}
signed main() {
// freopen("in", "r", stdin), freopen("out", "w", stdout);
scanf("%s", s + 1);
n = strlen(s + 1);
for (int i = 1; i <= n; i++)Rank[i] = s[i], m = max(m, int(s[i])), tp[i] = i;
Rank_Sort();
for (int w = 1, p = 0, i = 0; w <= n; w *= 2, m = p) {
if (p == n)break;
for (p = 0, i = n - w + 1; i <= n; i++)tp[++p] = i;
for (i = 1; i <= n; i++)if (Sa[i] > w)tp[++p] = Sa[i] - w;
Rank_Sort();
for (i = 1; i <= n; i++)tp[i] = Rank[i];
Rank[Sa[1]] = p = 1;
for (i = 2; i <= n; i++)
Rank[Sa[i]] = tp[Sa[i]] == tp[Sa[i - 1]] && tp[Sa[i] + w] == tp[Sa[i - 1] + w] ? p : ++p;
}
int j, k = 0;
for (int i = 1; i <= n; Height[Rank[i++]] = k)
for (k = k ? k - 1 : k, j = Sa[Rank[i] - 1]; s[i + k] == s[j + k]; ++k);
return 0;
}