#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
inline int read() {
  int x = 0;
  bool f = 0;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar()) f = (ch == '-');
  for (; isdigit(ch); ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ 48);
  return f ? -x : x;
}
int n;
char s[N];
int len[17];
int spc[N][17];
int sum[N][26];
long long cost[N];
long long con[N][26];
unsigned long long h[N], pw[N];
inline unsigned long long geth(int l, int r) {
  return h[r] - h[l - 1] * pw[r - l + 1];
}
inline int getlcp(int a, int b) {
  int l = 0, r = n - max(a, b) + 1;
  while (l < r) {
    int mid = (l + r + 1) >> 1;
    if (geth(a, a + mid - 1) == geth(b, b + mid - 1))
      l = mid;
    else
      r = mid - 1;
  }
  return r;
}
int main() {
  scanf("%s", s + 1);
  n = strlen(s + 1);
  for (int i = 1; i <= n; ++i) s[i] -= 'a', spc[i][1] = 1;
  for (int i = pw[0] = 1; i <= n; ++i)
    h[i] = h[i - 1] * 233 + s[i], pw[i] = pw[i - 1] * 233;
  for (int i = 0; i < 26; ++i)
    for (int j = 1; j <= n; ++j) sum[j][i] = sum[j - 1][i] + (s[j] == i);
  for (int w = 1; w <= 16; ++w) len[w] = (1 << w) - 1;
  long long tmp = n;
  for (int w = 2; w <= 16; ++w) {
    for (int i = 1; i + len[w] - 1 <= n; ++i) {
      if (!(spc[i][w - 1] & spc[i + len[w - 1] + 1][w - 1])) continue;
      if (geth(i, i + len[w - 1] - 1) !=
          geth(i + len[w - 1] + 1, i + len[w] - 1))
        continue;
      if (sum[i + len[w] - 1][s[i + len[w - 1]]] -
              sum[i - 1][s[i + len[w - 1]]] >
          1)
        continue;
      spc[i][w] = 1;
      tmp += 1ll * len[w] * len[w];
      cost[i] += 1ll * len[w] * len[w];
      cost[i + len[w]] -= 1ll * len[w] * len[w];
    }
  }
  for (int i = 1; i <= n; ++i) cost[i] += cost[i - 1];
  for (int w = 2; w <= 16; ++w) {
    for (int i = 1; i + len[w] - 1 <= n; ++i) {
      int r = i + len[w] - 1, mid = i + len[w - 1];
      if (!spc[i][w - 1] && !spc[mid + 1][w - 1]) continue;
      if (spc[i][w - 1] && geth(i, mid - 1) == geth(mid + 1, r)) {
        for (int u = 0; u < 26; ++u)
          if (!(sum[r][u] - sum[i - 1][u] - (s[mid] == u)))
            con[mid][u] += 1ll * len[w] * len[w];
        continue;
      }
      if (spc[i][w - 1]) {
        int lcp = getlcp(i, mid + 1);
        int lcp2 = getlcp(i + lcp + 1, mid + 1 + lcp + 1);
        int dif = mid + 1 + lcp + 1 + lcp2, pos = mid + 1 + lcp;
        if (dif > r && pos <= r &&
            (sum[r][s[mid]] - sum[i - 1][s[mid]] - 1 - (s[pos] == s[mid])) ==
                0) {
          con[pos][s[i + lcp]] += 1ll * len[w] * len[w];
        }
      }
      if (spc[mid + 1][w - 1]) {
        int lcp = getlcp(i, mid + 1);
        int lcp2 = getlcp(i + lcp + 1, mid + 1 + lcp + 1);
        int dif = mid + 1 + lcp + 1 + lcp2, pos = i + lcp;
        if (dif > r && pos < mid &&
            (sum[r][s[mid]] - sum[i - 1][s[mid]] - 1 - (s[pos] == s[mid])) ==
                0) {
          con[pos][s[mid + 1 + lcp]] += 1ll * len[w] * len[w];
        }
      }
    }
  }
  long long ans = tmp;
  for (int i = 1; i <= n; ++i)
    for (int j = 0; j < 26; ++j) ans = max(ans, tmp - cost[i] + con[i][j]);
  printf("%lld\n", ans);
  return 0;
}
