Cod sursa(job #1322969)

Utilizator hrazvanHarsan Razvan hrazvan Data 20 ianuarie 2015 16:04:17
Problema PScPld Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <stdio.h>
#define MAXN 1000000
char v[2 * MAXN + 1];
int rez[2 * MAXN + 1];

void solve(int n){
  int i, dr = 0, st = 0, ci, j;
  for(i = 0; i <= n; i++){
    if(i <= dr){
      ci = st + dr - i;
      if(ci - rez[ci] / 2 >= st)
        j = i + rez[ci] / 2 + 1;
      else
        j = dr + 1;
    }
    else
      j = i + 1;
    while(i - (j - i) >= 0 && j <= n && v[j] == v[i - (j - i)])
      j++;
    j--;
    rez[i] = 2 * (j - i) + 1;
    if(dr < j){
      dr = j;
      st = i - (j - i);
    }
  }
}

int main(){
  FILE *in = fopen("pscpld.in", "r");
  int n = 1, i;
  char ch = fgetc(in);
  while(ch >= 'a' && ch <= 'z'){
    v[n] = ch;
    n += 2;
    ch = fgetc(in);
  }
  fclose(in);
  n--;
  solve(n);
  long long sum = 0;
  for(i = 0; i <= n; i++){
    sum += rez[i] / 4;
  }
  sum += (n + 1) / 2;
  FILE *out = fopen("pscpld.out", "w");
  fprintf(out, "%lld", sum);
  fclose(in);
  return 0;
}