#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#define ll long long
bool yes = 0;
#define fr(i, a, b) for(int i = a; i <= b; i++)
#define frd(i, a, b) for(int i = a; i >= b; i--)
#define pb push_back
#define pu push
#define name
#define oo 1e9
#define pii pair<int, int>
#define pll pair<ll, ll>
#define fi first
#define se second
#define tangtoc ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define BIT(x,i) (((x) >> (i)) & 1)
#define MASK(i) ((1LL) << (i))
#define sz(s) (int)(s.size())
using namespace std;
using namespace __gnu_pbds;
const int N = 5*1e6,sm = 1e9+7,M = 2*1e5+20,BIT = 25;
template <class X, class Y>
bool maximize(X &x, const Y &y){
if (x < y){
x = y;
return true;
}
return false;
}
template <class X, class Y>
bool minimize(X &x, const Y &y){
if (x > y){
x = y;
return true;
}
return false;
}
ll add(ll x,const ll &y){
x = (x%sm+y)%sm;
return x;
}
ll mul(ll x,const ll &y){
x = (x%sm*y)%sm;
return x;
}
ll modpow(ll a,ll b,ll sm){
ll res = 1;
a %= sm;
while (b){
if (b & 1) res = res*a%sm;
a = a*a%sm;
b >>= 1;
}
return res;
}
/*struct pair_hash {
std::size_t operator()(const std::pair<int, int>& p) const {
return std::hash<int>()(p.first) ^ (std::hash<int>()(p.second) << 1);
}
};
gp_hash_table<ll,ll> mp;
*/
//------------------------------------------------------NEVER-ENOUGH--------------------------------------------------------------
int n,kmp[N];
string s;
void read(){
cin >> s;
n = sz(s);
s = "_"+s;
}
void solve(){
int k = kmp[1] = 0;
for (int i = 2; i <= n; i++){
while (k > 0 && s[i] != s[k+1]) k = kmp[k];
kmp[i] = (s[i] == s[k+1]) ? ++k : 0;
}
multiset <int> se;
ll res = 0;
for (int i = 1; i <= n; i++){
int tmp = kmp[i];
if (se.count(tmp)) res += tmp;
else res += kmp[kmp[i]];
se.insert(tmp);
}
cout << res;
}
int main(){
tangtoc;
//Code bat dau tu day
//freopen("name.INP","r",stdin);
//freopen("name.OUT","w",stdout);
int test; test = 1;
if (yes) cin >> test;
for (int i = 1; i <= test; i++){
read();
solve();
}
cerr << "\nTime : " << 0.001 * clock() << "s ";
return 0;
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4KI2RlZmluZSBsbCBsb25nIGxvbmcKYm9vbCB5ZXMgPSAwOwojZGVmaW5lIGZyKGksIGEsIGIpIGZvcihpbnQgaSA9IGE7IGkgPD0gYjsgaSsrKQojZGVmaW5lIGZyZChpLCBhLCBiKSBmb3IoaW50IGkgPSBhOyBpID49IGI7IGktLSkKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBwdSBwdXNoCiNkZWZpbmUgbmFtZQojZGVmaW5lIG9vIDFlOQojZGVmaW5lIHBpaSBwYWlyPGludCwgaW50PgojZGVmaW5lIHBsbCBwYWlyPGxsLCBsbD4KI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIHRhbmd0b2MgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTtjaW4udGllKDApO2NvdXQudGllKDApOwojZGVmaW5lIEJJVCh4LGkpICgoKHgpID4+IChpKSkgJiAxKQojZGVmaW5lIE1BU0soaSkgKCgxTEwpIDw8IChpKSkKI2RlZmluZSBzeihzKSAoaW50KShzLnNpemUoKSkKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CmNvbnN0IGludCBOID0gNSoxZTYsc20gPSAxZTkrNyxNID0gMioxZTUrMjAsQklUID0gMjU7CnRlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgogICAgYm9vbCBtYXhpbWl6ZShYICZ4LCBjb25zdCBZICZ5KXsKICAgICAgICBpZiAoeCA8IHkpewogICAgICAgICAgICB4ID0geTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KdGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CiAgICBib29sIG1pbmltaXplKFggJngsIGNvbnN0IFkgJnkpewogICAgICAgIGlmICh4ID4geSl7CiAgICAgICAgICAgIHggPSB5OwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQpsbCBhZGQobGwgeCxjb25zdCBsbCAmeSl7CiAgICB4ID0gKHglc20reSklc207CiAgICByZXR1cm4geDsKfQpsbCBtdWwobGwgeCxjb25zdCBsbCAmeSl7CiAgICB4ID0gKHglc20qeSklc207CiAgICByZXR1cm4geDsKfQpsbCBtb2Rwb3cobGwgYSxsbCBiLGxsIHNtKXsKICAgIGxsIHJlcyA9IDE7CiAgICBhICU9IHNtOwogICAgd2hpbGUgKGIpewogICAgICAgIGlmIChiICYgMSkgcmVzID0gcmVzKmElc207CiAgICAgICAgYSA9IGEqYSVzbTsKICAgICAgICBiID4+PSAxOwogICAgfQogICAgcmV0dXJuIHJlczsKfQovKnN0cnVjdCBwYWlyX2hhc2ggewogICAgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnBhaXI8aW50LCBpbnQ+JiBwKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIHN0ZDo6aGFzaDxpbnQ+KCkocC5maXJzdCkgXiAoc3RkOjpoYXNoPGludD4oKShwLnNlY29uZCkgPDwgMSk7CiAgICB9Cn07CmdwX2hhc2hfdGFibGU8bGwsbGw+IG1wOwoqLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLU5FVkVSLUVOT1VHSC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBuLGttcFtOXTsKc3RyaW5nIHM7CnZvaWQgcmVhZCgpewogICAgY2luID4+IHM7CiAgICBuID0gc3oocyk7CiAgICBzID0gIl8iK3M7Cn0Kdm9pZCBzb2x2ZSgpewogICAgaW50IGsgPSBrbXBbMV0gPSAwOwogICAgZm9yIChpbnQgaSA9IDI7IGkgPD0gbjsgaSsrKXsKICAgICAgICB3aGlsZSAoayA+IDAgJiYgc1tpXSAhPSBzW2srMV0pIGsgPSBrbXBba107CiAgICAgICAga21wW2ldID0gKHNbaV0gPT0gc1trKzFdKSA/ICsrayA6IDA7CiAgICB9CiAgICBtdWx0aXNldCA8aW50PiBzZTsKICAgIGxsIHJlcyA9IDA7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspewogICAgICAgIGludCB0bXAgPSBrbXBbaV07CiAgICAgICAgaWYgKHNlLmNvdW50KHRtcCkpIHJlcyArPSB0bXA7CiAgICAgICAgZWxzZSByZXMgKz0ga21wW2ttcFtpXV07CiAgICAgICAgc2UuaW5zZXJ0KHRtcCk7CiAgICB9CiAgICBjb3V0IDw8IHJlczsKfQppbnQgbWFpbigpewogICAgdGFuZ3RvYzsKICAgIC8vQ29kZSBiYXQgZGF1IHR1IGRheQogICAgLy9mcmVvcGVuKCJuYW1lLklOUCIsInIiLHN0ZGluKTsKICAgIC8vZnJlb3BlbigibmFtZS5PVVQiLCJ3IixzdGRvdXQpOwogICAgaW50IHRlc3Q7IHRlc3QgPSAxOwogICAgaWYgKHllcykgY2luID4+IHRlc3Q7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSB0ZXN0OyBpKyspewogICAgICAgIHJlYWQoKTsKICAgICAgICBzb2x2ZSgpOwogICAgfQogICAgY2VyciA8PCAiXG5UaW1lIDogIiA8PCAwLjAwMSAqIGNsb2NrKCkgPDwgInMgIjsKICAgIHJldHVybiAwOwp9Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCg==