#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
const int Step = 17;
const int key = 10007;
char s[maxn];
int n;
long long v[maxn];
int a[maxn][26];
long long h[maxn], g[maxn];
bool dp[maxn][Step + 1];
long long ans = 0;
long long res;
long long get(int l, int r) { return h[r] - h[l - 1] * g[r - l + 1]; }
int calc(int l, int r, int c) { return a[r][c] - a[l - 1][c]; }
void prepare() {
  int u;
  g[0] = 1;
  for (int i = 1; i <= n; i++)
    h[i] = h[i - 1] * key + s[i], g[i] = g[i - 1] * key;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < 26; j++) a[i][j] = a[i - 1][j];
    a[i][s[i] - 'a']++;
  }
  for (int j = 1, k = 0; j <= n; k++, j = 2 * j + 1) {
    for (int i = 1; i + j - 1 <= n; i++) {
      u = i + j / 2;
      if ((!k) || (get(i, u - 1) == get(u + 1, i + j - 1) && dp[i][k - 1] &&
                   dp[u + 1][k - 1] && calc(i, i + j - 1, s[u] - 'a') == 1)) {
        dp[i][k] = 1;
        v[i] += (long long)j * j;
        v[i + j] -= (long long)j * j;
        ans += (long long)j * j;
      }
    }
  }
  for (int i = 2; i <= n; i++) v[i] += v[i - 1];
}
void dfs(int L, int R, long long hash) {
  int len = R - L + 1;
  res += (long long)len * len;
  if (R + 1 + len <= n && get(R + 2, R + len + 1) == hash &&
      calc(R + 1, R + len + 1, s[R + 1] - 'a') == 1)
    dfs(L, R + len + 1, hash * g[len + 1] + s[R + 1] * g[len] + hash);
  if (L - 1 - len >= 1 && get(L - 1 - len, L - 2) == hash &&
      calc(L - 1 - len, L - 1, s[L - 1] - 'a') == 1)
    dfs(L - 1 - len, R, hash * g[len + 1] + s[L - 1] * g[len] + hash);
}
void work() {
  long long tot = ans;
  for (int i = 1; i <= n; i++) {
    for (int c = 0; c < 26; c++) {
      res = tot - v[i];
      for (int j = 0, k = 0; j + i <= n && i - j >= 1; j = 2 * j + 1, k++) {
        if ((!k) || (get(i - j, i - 1) == get(i + 1, i + j) &&
                     dp[i - j][k - 1] && dp[i + 1][k - 1] &&
                     calc(i - j, i - 1, c) + calc(i + 1, i + j, c) == 0)) {
          dfs(i - j, i + j,
              get(i - j, i - 1) * g[j + 1] + g[j] * ('a' + c) +
                  get(i + 1, i + j));
        }
      }
      ans = max(ans, res);
    }
  }
}
int main() {
  scanf("%s", s + 1), n = strlen(s + 1);
  prepare();
  work();
  printf("%lld\n", ans);
  return 0;
}
