Cod sursa(job #3217524)

Utilizator Traian_7109Traian Mihai Danciu Traian_7109 Data 23 martie 2024 13:27:41
Problema PScPld Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.82 kb
#include <bits/stdc++.h>

using namespace std;

const int nmax = 1e6;
int len[5 + 2 * nmax];

int main() {
  ifstream fin("pscpld.in");
  ofstream fout("pscpld.out");
  string s;
  fin >> s;
  string t = "#";
  for (int i = 0; i < (int)s.size(); i++) {
    t.push_back(s[i]);
    t += "#";
  }
  s = t;
  int n = s.size() - 1;
  long long ans = 0;
  int maxim = 0, posmax = 0;
  for (int i = 1; i <= n; i++) {
    int dist = 2 * posmax - i;
    if (maxim > dist) {
      if (dist >= 0)
        len[i] = min(len[dist], maxim - i);
      else
        len[i] = maxim - i;
    }
    while (0 <= i - len[i] - 1 && i + len[i] + 1 <= n && s[i - len[i] - 1] == s[i + len[i] + 1])
      len[i]++;
    ans += (len[i] + i % 2) / 2;
    if (i + len[i] > maxim) {
      maxim = i + len[i];
      posmax = i;
    }
  }
  fout << ans << '\n';
  return 0;
}