#include <bits/stdc++.h>
using std::max;
char s[100010];
int n;
namespace HASH {
unsigned long long h[100010], mi[100010];
inline unsigned long long getsub(int l, int r) {
  return h[r] - h[l - 1] * mi[r - l + 1];
}
inline bool check(int l1, int r1, int l2, int r2) {
  return getsub(l1, r1) == getsub(l2, r2);
}
inline int lcp(int s1, int s2) {
  int ret = 0;
  for (int i = 16; i >= 0; --i) {
    int len = ret + (1 << i);
    if (s1 + len - 1 <= n && s2 + len - 1 <= n &&
        check(s1, s1 + len - 1, s2, s2 + len - 1)) {
      ret += (1 << i);
    }
  }
  return ret;
}
inline void init() {
  mi[0] = 1;
  for (int i = 1; i <= n; ++i) mi[i] = mi[i - 1] * 13331;
  for (int i = 1; i <= n; ++i) h[i] = h[i - 1] * 13331 + s[i] - 'a';
}
}  // namespace HASH
using HASH::check;
using HASH::lcp;
bool isgray[100010][17];
int cnt[100010][26];
long long val, a[100010], score[100010][26];
inline void calc_score(int st, int j) {
  if (j == 1) {
    for (int i = 0; i < 26; ++i) ++score[st][i];
    return;
  }
  int cent = st + (1 << (j - 1)) - 1;
  int s1 = st, s2 = cent + 1;
  long long temp = 1ll * ((1 << j) - 1) * ((1 << j) - 1);
  if (isgray[s1][j - 1] && isgray[s2][j - 1] &&
      check(s1, cent - 1, s2, s1 + (1 << j) - 2)) {
    for (int i = 0; i < 26; ++i) {
      if (cnt[s1 - 1][i] == cnt[cent - 1][i]) score[cent][i] += temp;
    }
  }
  int prefix = lcp(s1, s2);
  if (s1 + prefix >= cent) return;
  int d1 = s1 + prefix, d2 = s2 + prefix;
  int prefix2 = lcp(d1 + 1, d2 + 1);
  if (d1 + 1 + prefix2 < cent) return;
  if (isgray[s2][j - 1] &&
      cnt[s2 + (1 << (j - 1)) - 2][s[cent] - 'a'] == cnt[cent][s[cent] - 'a']) {
    score[d1][s[d2] - 'a'] += temp;
  }
  if (isgray[s1][j - 1] &&
      cnt[s1 - 1][s[cent] - 'a'] == cnt[cent - 1][s[cent] - 'a']) {
    score[d2][s[d1] - 'a'] += temp;
  }
}
int main() {
  scanf("%s", s + 1);
  n = strlen(s + 1);
  for (int i = 1; i <= n; ++i)
    for (int j = 0; j < 26; ++j) cnt[i][j] = cnt[i - 1][j] + (s[i] - 'a' == j);
  HASH::init();
  for (int i = 1; i <= n; ++i) isgray[i][1] = 1;
  val = n;
  for (int j = 2; j <= 16; ++j)
    for (int i = 1; i + (1 << j) - 2 <= n; ++i) {
      isgray[i][j] =
          (isgray[i][j - 1] && isgray[i + (1 << (j - 1))][j - 1] &&
           check(i, i + (1 << (j - 1)) - 2, i + (1 << (j - 1)),
                 i + (1 << j) - 2) &&
           cnt[i + (1 << (j - 1)) - 2][s[i + (1 << (j - 1)) - 1] - 'a'] ==
               cnt[i - 1][s[i + (1 << (j - 1)) - 1] - 'a']);
      val += 1ll * isgray[i][j] * ((1 << j) - 1) * ((1 << j) - 1);
    }
  for (int j = 1; j <= 16; ++j)
    for (int i = 1; i + (1 << j) - 2 <= n; ++i) {
      a[i] += 1ll * isgray[i][j] * ((1 << j) - 1) * ((1 << j) - 1);
      a[i + (1 << j) - 1] -=
          1ll * isgray[i][j] * ((1 << j) - 1) * ((1 << j) - 1);
    }
  for (int i = 2; i <= n; ++i) a[i] += a[i - 1];
  for (int i = 1; i <= n; ++i)
    for (int j = 1; i + (1 << j) - 2 <= n; ++j) {
      calc_score(i, j);
    }
  long long delta = 0;
  for (int i = 1; i <= n; ++i)
    for (int j = 0; j < 26; ++j) delta = max(delta, score[i][j] - a[i]);
  printf("%I64d\n", val + delta);
  return 0;
}
