Cod sursa(job #1165303)

Utilizator omerOmer Cerrahoglu omer Data 2 aprilie 2014 16:52:41
Problema PScPld Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include<stdio.h>
#include<string.h>
const int N=1000001;
using namespace std;
FILE *f,*g;

char c[2*N]; int dr[2*N];

int n,sum,max;

void read(void){
    
    f=fopen("pscpld.in","r");
    g=fopen("pscpld.out","w");

    fscanf(f,"%s",c);
    
    n=strlen(c);
    int i;
    
    for(i=2*n-1;i>=1;i-=2) c[i]=c[i/2];
    for(i=2*n;i>=0;i-=2) c[i]='#';
    n=2*n;
}

void afla(int i){
    
    int aux; int curr;
    if (dr[max]>=i){
        
        aux=2*max-i;
        if (dr[aux] < aux+dr[max]-i) {dr[i]=dr[aux]-aux+i; sum+=(dr[i]-i+1)/2; return;}
        else curr=dr[max]+1;
    }
    else curr=i+1;
    
    while(curr<=n && 2*i>=curr && c[curr] == c[2*i-curr]) curr++;
     
    dr[i]=curr-1;
    max=i;
    if (i%2 == 1) sum+=(dr[i]-i+1)/2;
    else  sum+=(dr[i]-i+1)/2;
    
}

void solve(void){

    max=0; dr[max]=0;
    int i;
    for(i=1;i<=n-1;i++) afla(i);
    fprintf(g,"%d",sum);
}

int main(void){

    read();
    solve();
    return 0;
}