Cod sursa(job #2798608)

Utilizator iancupoppPopp Iancu Alexandru iancupopp Data 11 noiembrie 2021 16:48:48
Problema PScPld Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.83 kb
#include <fstream>

using namespace std;

const int N = 2e6 + 5;

char s[N];
int p[N], m;

void mnc() {
  int i = 0, r = 1;
  while (i < m) {
    while (i - r >= 0 && i + r < m && s[i - r] == s[i + r])
      ++r;
    p[i] = r;
    int old_i = i, old_r = r;
    ++i;
    while (i < old_i + old_r) {
      int i_left = old_i - (i - old_i);
      if (i_left - p[i_left] > old_i - old_r)
        p[i++] = p[i_left];
      else if (i_left - p[i_left] < old_i - old_r)
        p[i++] = i_left - (old_i - old_r);
      else {
        r = p[i_left];
        break;
      }
    }
  }
}

int main() {
  ifstream cin("pscpld.in");
  ofstream cout("pscpld.out");
  char c;
  for (m = 1; cin >> s[m]; m += 2) {}
  cin.close();
  mnc();
  long long ans = 0;
  for (int i = 1; i < m; ++i)
    ans += p[i] / 2;
  cout << ans << "\n";
  cout.close();
  return 0;
}