Cod sursa(job #2470132)

Utilizator MoodyFaresFares Mohamad MoodyFares Data 8 octombrie 2019 19:04:16
Problema PScPld Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

const int MAX_N = 1000000;

char s1[5 + 2 * MAX_N];
char s[5 + 2 * MAX_N];
int LPS[5 + 2 * MAX_N];

int main() {
  freopen("pscpld.in", "r", stdin);
  freopen("pscpld.out", "w", stdout);

  scanf("%s", s1);
  int n = strlen(s1);
  int k = 0;
  for (int i = 0; i < n; i++) {
    s[++k] = s1[i];
    s[++k] = '|';
  }
  s[0] = '.';
  s[k] = ';';
  int N = k - 1;
  int st, dr;
  st = dr = 0;
  for (int i = 1; i <= N; ++i) {
    if (i > dr) {
      LPS[i] = 1;
    } else {
      LPS[i] = std::min(dr - i + 1, LPS[dr + st - i]);
    }
    while (s[i - LPS[i]] == s[i + LPS[i]]) {
      ++LPS[i];
    }
    if (i + LPS[i] - 1 > dr) {
      st = i + 1 - LPS[i];
      dr = i + LPS[i] - 1;
    }
  }
  long long ans = 0;
  for (int i = 1; i <= N; ++i) {
    if (s[i] >= 'a' && s[i] <= 'z') {
      ans += 1LL * ((LPS[i] + 1) / 2);
    } else {
      ans += 1LL * (LPS[i] / 2);
    }
  }
  printf ("%lld\n", ans);
  return 0;
}