Cod sursa(job #1003432)

Utilizator assa98Andrei Stanciu assa98 Data 30 septembrie 2013 18:31:34
Problema PScPld Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;

const int MAX_N=2000100;

char sir[MAX_N];
char s[MAX_N];

int d[MAX_N];

void extinde(int i) {
    while(sir[i+d[i]+1]==sir[i-d[i]-1] && d[i]<i ) {
        d[i]++;
    }
}

void get_sir() {
    int n=strlen(s);
    int sz=0;
    sir[sz]='#';
    for(int i=0;i<n;i++) {
        sir[++sz]=s[i];
        sir[++sz]='#';
    }
}

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

    int n=strlen(sir+1);
    int p=0;
    int sol=0;
   
    for(int i=1;i<=n;i++) {
        if(p+d[p]<i) {
            extinde(i);
        }
        else if( (p-(i-p))-d[p-(i-p)]<=p-d[p]) {
            d[i]=d[p]-(i-p);
            extinde(i);
        }
        else if( (p-(i-p))-d[p-(i-p)]>p-d[p]) {
            d[i]=d[p-(i-p)];
        }

        if(i+d[i]>p+d[p]) {
            p=i;
        }
        sol+=(d[i]+1)/2;
        //printf("%d ",d[i]);        
    }

    printf("%d",sol);

    return 0;
}