#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int p = 311;
const int MOD = 1e9 + 9277;
const int N = 5e6 + 5;
int n;
string s;
int p_pow[N], h[N];
int inv_p_pow[N], rev_h[N];
int binpow(int a, int b) {
int ans = 1;
for (; b > 0; b >>= 1) {
if (b & 1) ans = 1ll * ans * a % MOD;
a = 1ll * a * a % MOD;
}
return ans;
}
void precompute() {
p_pow[0] = 1;
for (int i = 1; i <= n; i++) {
p_pow[i] = 1ll * p_pow[i - 1] * p % MOD;
}
inv_p_pow[n] = binpow(p_pow[n], MOD - 2);
for (int i = n - 1; i >= 0; i--) {
inv_p_pow[i] = 1ll * inv_p_pow[i + 1] * p % MOD;
}
h[0] = rev_h[0] = 0;
for (int i = 1; i <= n; i++) {
h[i] = (1ll * h[i - 1] * p + s[i]) % MOD;
rev_h[i] = (rev_h[i - 1] + 1ll * s[i] * p_pow[i - 1] % MOD) % MOD;
}
}
int getHash(int l, int r) {
return (h[r] - 1ll * h[l - 1] * p_pow[r - l + 1] % MOD + MOD) % MOD;
}
int getRevHash(int l, int r) {
return 1ll * (rev_h[r] - rev_h[l - 1] + MOD) % MOD * inv_p_pow[l - 1] % MOD;
}
bool isPalin(int l, int r) {
return (getHash(l, r) == getRevHash(l, r));
}
int memo[N];
// Bậc đối xứng của xâu s[1..i]
int deg(int i) {
if (i == 0 || !isPalin(1, i)) return 0;
int& ans = memo[i];
if (ans != -1) return ans;
return ans = 1 + deg(i / 2);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> s;
n = s.size();
s = ' ' + s;
precompute();
memset(memo, -1, sizeof memo);
ll ans = 0;
for (int i = 1; i <= n; i++) ans += deg(i);
cout << ans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IHAgPSAzMTE7IApjb25zdCBpbnQgTU9EID0gMWU5ICsgOTI3NzsgCmNvbnN0IGludCBOID0gNWU2ICsgNTsgCgppbnQgbjsgCnN0cmluZyBzOyAKaW50IHBfcG93W05dLCBoW05dOyAKaW50IGludl9wX3Bvd1tOXSwgcmV2X2hbTl07IAoKaW50IGJpbnBvdyhpbnQgYSwgaW50IGIpIHsKCWludCBhbnMgPSAxOyAKCWZvciAoOyBiID4gMDsgYiA+Pj0gMSkgewoJCWlmIChiICYgMSkgYW5zID0gMWxsICogYW5zICogYSAlIE1PRDsgIAoJCWEgPSAxbGwgKiBhICogYSAlIE1PRDsgCgl9CglyZXR1cm4gYW5zOwp9Cgp2b2lkIHByZWNvbXB1dGUoKSB7CglwX3Bvd1swXSA9IDE7IAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJcF9wb3dbaV0gPSAxbGwgKiBwX3Bvd1tpIC0gMV0gKiBwICUgTU9EOyAgCgl9CgoJaW52X3BfcG93W25dID0gYmlucG93KHBfcG93W25dLCBNT0QgLSAyKTsgCglmb3IgKGludCBpID0gbiAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJaW52X3BfcG93W2ldID0gMWxsICogaW52X3BfcG93W2kgKyAxXSAqIHAgJSBNT0Q7IAoJfQoKCWhbMF0gPSByZXZfaFswXSA9IDA7ICAKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewoJCWhbaV0gPSAoMWxsICogaFtpIC0gMV0gKiBwICsgc1tpXSkgJSBNT0Q7IAoJCXJldl9oW2ldID0gKHJldl9oW2kgLSAxXSArIDFsbCAqIHNbaV0gKiBwX3Bvd1tpIC0gMV0gJSBNT0QpICUgTU9EOyAKCX0KfQoKaW50IGdldEhhc2goaW50IGwsIGludCByKSB7CglyZXR1cm4gKGhbcl0gLSAxbGwgKiBoW2wgLSAxXSAqIHBfcG93W3IgLSBsICsgMV0gJSBNT0QgKyBNT0QpICUgTU9EOyAKfQoKaW50IGdldFJldkhhc2goaW50IGwsIGludCByKSB7CglyZXR1cm4gMWxsICogKHJldl9oW3JdIC0gcmV2X2hbbCAtIDFdICsgTU9EKSAlIE1PRCAqIGludl9wX3Bvd1tsIC0gMV0gJSBNT0Q7IAp9Cgpib29sIGlzUGFsaW4oaW50IGwsIGludCByKSB7CglyZXR1cm4gKGdldEhhc2gobCwgcikgPT0gZ2V0UmV2SGFzaChsLCByKSk7IAp9CgppbnQgbWVtb1tOXTsgIAoKLy8gQuG6rWMgxJHhu5FpIHjhu6luZyBj4bunYSB4w6J1IHNbMS4uaV0KaW50IGRlZyhpbnQgaSkgewoJaWYgKGkgPT0gMCB8fCAhaXNQYWxpbigxLCBpKSkgcmV0dXJuIDA7ICAKCWludCYgYW5zID0gbWVtb1tpXTsgIAoJaWYgKGFucyAhPSAtMSkgcmV0dXJuIGFuczsgIAoJcmV0dXJuIGFucyA9IDEgKyBkZWcoaSAvIDIpOyAKfQoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IAoJY2luLnRpZShudWxscHRyKTsgCQoJY2luID4+IHM7IAoJbiA9IHMuc2l6ZSgpOyAKCXMgPSAnICcgKyBzOyAgCgoJcHJlY29tcHV0ZSgpOyAgCgoJbWVtc2V0KG1lbW8sIC0xLCBzaXplb2YgbWVtbyk7ICAKCglsbCBhbnMgPSAwOyAgCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGFucyArPSBkZWcoaSk7ICAKCQoJY291dCA8PCBhbnMgPDwgJ1xuJzsgCn0=