Cod sursa(job #1982694)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 19 mai 2017 22:55:05
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <cstdio>
#include <cstring>

using namespace std;

const int MAX_N = 1000000;

char s[MAX_N + 5];
char q[2 * MAX_N + 5];

int m[2 * MAX_N + 5];

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

  gets(s + 1);

  int mid = 1, R = 1, n = strlen(s + 1);

  for (int i = 1; i <= n; ++i)
    q[2 * i - 1] = s[i];

  for (int i = 1; i <= 2 * n; ++i) {
    int sim = mid - (i - mid);
    int dif = m[sim];
    if (i > R) {
      int l = i;
      int r = i;
      while (l > 0 && r <= 2 * n && q[l] == q[r]) {
        m[i]++;
        l--;
        r++;
      }
      l++;
      r--;
      R = r;
      mid = i;
    } else if (i + dif >= R) {
      int l = i - (R - i);
      int r = R;
      m[i] = R - i;
      while (l > 0 && r <= 2 * n && q[l] == q[r]) {
        m[i]++;
        l--;
        r++;
      }
      l++;
      r--;
      R = r;
      mid = i;
    } else {
      m[i] = dif;
    }
  }

  long long ans = 0;

  for (int i = 1; i <= 2 * n; ++i) {
    if (q[i] == 0) {
      ans = ans + m[i] / 2;
    }else {
      ans = ans + (m[i] - 1) / 2 + 1;
    }
  }

  printf("%lld\n", ans);

  return 0;
}