Cod sursa(job #1165306)

Utilizator omerOmer Cerrahoglu omer Data 2 aprilie 2014 16:55:33
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 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,max; long long sum;

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+=(long long)(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;
    sum+=(long long)(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,"%lld",sum);
}

int main(void){

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