#include <bits/stdc++.h>
using namespace std;
const int INF = ((long long)1E9 + 7);
template <class C>
void mini(C &aaaa, C bbbb) {
  aaaa = min(aaaa, bbbb);
}
template <class C>
void maxi(C &aaaa, C bbbb) {
  aaaa = max(aaaa, bbbb);
}
string s;
struct gray {
  int pos, d;
  pair<int, char> change;
  char get(int i) const {
    int p = pos - (1 << d) + (1 << i);
    if (p == change.first)
      return change.second;
    else
      return s[p];
  }
  gray(int _pos = -1, int _d = 0)
      : pos(_pos), d(_d), change(make_pair(-1, 0)) {}
  void print() {
    cout << "[";
    for (int i = 0; i < (d + 1); ++i) cout << get(i);
    cout << "]";
    cout << change.first << change.second << endl;
  }
};
void match(gray const &a, gray const &b, int pos, char mid, vector<gray> &res) {
  int l = a.d;
  for (int i = (l); i >= (0); --i)
    if (a.get(i) != b.get(i)) return;
  if (a.change.first >= 0 && b.change.first >= 0) return;
  bool prev[26];
  for (int i = 0; i < (26); ++i) prev[i] = false;
  for (int i = (0); i <= (l); ++i) prev[a.get(i) - 'a'] = true;
  for (int i = 0; i < (26); ++i) {
    if (prev[i]) continue;
    if (i != mid - 'a') {
      if (a.change.first == -1 && b.change.first == -1) {
        gray g(pos, a.d + 1);
        g.change = make_pair(pos, i + 'a');
        res.push_back(g);
      }
    } else {
      gray g(pos, a.d + 1);
      if (a.change.first >= 0)
        g.change = a.change;
      else
        g.change = b.change;
      res.push_back(g);
    }
  }
}
const int MN = 100100;
const int LG = 18;
vector<gray> tab[2][MN];
long long delta[MN];
long long M[MN][26];
void init(int pos, char mid, vector<gray> &res) {
  for (int i = 0; i < (26); ++i) {
    gray g(pos, 0);
    if (i != mid - 'a') {
      g.change = make_pair(pos, i + 'a');
    }
    res.push_back(g);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> s;
  int n = ((int)(s).size());
  for (int i = 0; i < (n); ++i) init(i, s[i], tab[0][i]);
  int d = 3;
  int ph = 1;
  long long sum = n;
  while (d <= n) {
    long long val = (long long)d * d;
    for (int i = 0; i < (n - d + 1); ++i) {
      vector<gray> &left = tab[ph ^ 1][i + d / 4];
      vector<gray> &right = tab[ph ^ 1][i + (3 * d) / 4];
      vector<gray> out;
      for (__typeof((left).begin()) it = ((left).begin()); it != (left).end();
           ++it)
        for (__typeof((right).begin()) jt = ((right).begin());
             jt != (right).end(); ++jt) {
          match(*it, *jt, i + d / 2, s[i + d / 2], out);
        }
      tab[ph][i + d / 2] = out;
      for (__typeof((out).begin()) it = ((out).begin()); it != (out).end();
           ++it) {
        if (it->change.first == -1) {
          delta[i] += val;
          delta[i + d] -= val;
          sum += val;
        } else
          M[it->change.first][it->change.second - 'a'] += (long long)d * d;
      }
    }
    d = 2 * d + 1;
    ph = (ph + 1) % 2;
  }
  long long bst = 0;
  long long cur = 0;
  for (int p = 0; p < (n); ++p) {
    cur += delta[p];
    for (int a = 0; a < (26); ++a) maxi(bst, M[p][a] - cur);
  }
  cout << sum + bst << endl;
  return 0;
}
