Cod sursa(job #1756999)

Utilizator cella.florescuCella Florescu cella.florescu Data 14 septembrie 2016 10:11:27
Problema PScPld Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb
#include <cstdio>
#include <cstring>
#include <cctype>
#define MAXN 1000000

using namespace std;

int raza[2*MAXN+5];
char v[2*MAXN+5]={'#'};

inline int minim(int a, int b){
  if(a<b)
    return a;
  return b;
}

int main()
{
    FILE *fin, *fout;
    long long ans;
    int n, x, r, i;
    fin=fopen("pscpld.in", "r");
    v[1]='*'; v[2]=fgetc(fin); n=2;
    while(isalpha(v[n])){
      v[++n]='*';
      v[++n]=fgetc(fin);
    }
    v[n]='$'; --n;
    fclose(fin);
    x=2; raza[2]=1; ans=1LL;
    for(i=3; i<n; i++){
      if(x+raza[x]>=i)
        r=minim(raza[x], raza[2*x-i]);
      while(v[i+r]==v[i-r])
        ++r;
      raza[i]=--r;
      if(r+i>raza[x]+x)
        x=i;
      ans+=1LL*(raza[i]+1)/2;
    }
    fout=fopen("pscpld.out", "w");
    fprintf(fout, "%lld\n", ans);
    fclose(fout);
    return 0;
}