#include <bits/stdc++.h>
using namespace std;
template <class T>
void splitstr(const string &s, vector<T> &out) {
  istringstream in(s);
  out.clear();
  copy(istream_iterator<T>(in), istream_iterator<T>(), back_inserter(out));
}
template <class T>
T gcd(T a, T b) {
  return b ? gcd(b, a % b) : a;
}
static void redirect(int argc, const char **argv) {
  if (argc > 1) {
    static filebuf f;
    f.open(argv[1], ios::in);
    cin.rdbuf(&f);
    if (!cin) {
      cerr << "Failed to open '" << argv[1] << "'" << endl;
      exit(1);
    }
  }
  if (argc > 2) {
    static filebuf f;
    f.open(argv[2], ios::out | ios::trunc);
    cout.rdbuf(&f);
    if (!cout) {
      cerr << "Failed to open '" << argv[2] << "'" << endl;
    }
  }
}
static char get(const vector<vector<char> > &gray,
                const vector<vector<map<pair<int, char>, char> > > &changes,
                int level, int pos, pair<int, char> ch) {
  int side = (1 << level) - 1;
  int left = pos - side;
  int right = pos + side;
  if (ch.first < left || ch.first > right)
    return gray[level][pos];
  else {
    auto p = changes[level][pos].find(ch);
    if (p == changes[level][pos].end())
      return 0;
    else
      return p->second;
  }
}
int main(int argc, const char **argv) {
  redirect(argc, argv);
  string str;
  int L;
  cin >> str;
  L = str.size();
  int N = 0;
  while ((1 << (N + 1)) - 1 <= L) N++;
  vector<long long> value(N);
  for (int i = 0; i < N; i++) {
    long long len = (1 << (i + 1)) - 1;
    value[i] = len * len;
  }
  vector<vector<char> > gray(N, vector<char>(L, '\0'));
  vector<vector<map<pair<int, char>, char> > > changes(
      N, vector<map<pair<int, char>, char> >(L));
  for (int i = 0; i < L; i++) {
    gray[0][i] = str[i];
    for (int j = 0; j < 26; j++)
      if ('a' + j != str[i])
        changes[0][i].insert(make_pair(pair<int, char>(i, 'a' + j), 'a' + j));
  }
  long long score = L;
  vector<long long> lose(L);
  vector<vector<long long> > gain(26, vector<long long>(L));
  for (int i = 1; i < N; i++) {
    const int side = (1 << i) - 1;
    const int step = 1 << (i - 1);
    for (int j = side; j < L - side; j++) {
      char left = gray[i - 1][j - step];
      char right = gray[i - 1][j + step];
      char mid = gray[i - 1][j];
      gray[i][j] =
          (left && mid && right && left == right && left != mid) ? str[j] : 0;
      for (int jump = -step; jump <= step; jump += step) {
        for (auto cx : changes[i - 1][j + jump]) {
          const pair<int, char> c = cx.first;
          char l2 = get(gray, changes, i - 1, j - step, c);
          char m2 = get(gray, changes, i - 1, j, c);
          char r2 = get(gray, changes, i - 1, j + step, c);
          if (l2 && m2 && r2 && l2 == r2 && l2 != m2)
            changes[i][j].insert(make_pair(c, m2));
        }
      }
      if (gray[i][j]) {
        score += value[i];
        for (int k = j - side; k <= j + side; k++) lose[k] += value[i];
      }
      for (auto cx : changes[i][j])
        gain[cx.first.second - 'a'][cx.first.first] += value[i];
    }
  }
  long long ans = score;
  for (int i = 0; i < 26; i++)
    for (int j = 0; j < L; j++) {
      long long cur = score - lose[j] + gain[i][j];
      ans = max(ans, cur);
    }
  cout << ans << '\n';
  return 0;
}
