int n, tot = 1, lst = 1, nxt[kMaxN][26], len[kMaxN], fa[kMaxN], sz[kMaxN]; i64 ans; std::vector<int> G[kMaxN];
voidins(int c){ int cur = ++tot, p = lst; lst = cur; len[cur] = len[p] + 1, sz[cur] = 1; for (; p && !nxt[p][c]; p = fa[p]) nxt[p][c] = cur; if (!p) { fa[cur] = 1; } else { int q = nxt[p][c]; if (len[q] == len[p] + 1) { fa[cur] = q; } else { int nw = ++tot; fa[nw] = fa[q], len[nw] = len[p] + 1; for (int i = 0; i < 26; ++i) nxt[nw][i] = nxt[q][i]; fa[q] = fa[cur] = nw; for (; p && nxt[p][c] == q; p = fa[p]) nxt[p][c] = nw; } } }
voiddfs(int u){ for (auto v : G[u]) { dfs(v); sz[u] += sz[v]; ans += (i64)sz[v] * (n - sz[v]) * (len[v] - len[u]); } }
voiddickdreamer(){ std::string s; std::cin >> s; n = s.size(); for (int i = n - 1; ~i; --i) ins(s[i] - 'a'); for (int i = 2; i <= tot; ++i) G[fa[i]].emplace_back(i); dfs(1); std::cout << ans << '\n'; }