Cod sursa(job #2398223)

Utilizator dobrandreiAndrei Dobra dobrandrei Data 5 aprilie 2019 10:42:46
Problema PScPld Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <stdio.h>
#include <iostream>
using namespace std;
FILE *in,*out;

int n,lps[2000015];
long long sol;
char s[2000015];

void read(){
    char c=fgetc(in);
    s[0]='#';
    while(!feof(in)){
        s[++n]=c;
        s[++n]='#';
        c=fgetc(in);
    }
}

void solve(){
    int r,c,ii;
    bool expand;
    lps[1]=1;
    for(int i=2;i<=n;i++){
        if(i%2)
            sol++;
        ii=2*c-i;
        expand=0;
        if(i>=r){
            lps[i]=0;
            expand=1;
        }
        else{
            if(lps[ii]<r-i)
                lps[i]=lps[ii];
            else{
                lps[i]=min(r-i,lps[ii]);
                expand=1;
            }
        }

        if(expand){
            while(i-lps[i]>0 && i+lps[i]<n){
                if((i-lps[i]-1)%2==0)
                    lps[i]++;
                else{
                    if(s[i-lps[i]-1]==s[i+lps[i]+1])
                        lps[i]++;
                    else
                        break;
                }
            }
        }
        sol+=1ll*lps[i]/2;
        if(r<i+lps[i])
            r=i+lps[i],c=i;
    }
    fprintf(out,"%lld",sol);
}
int main(){
    in=fopen("pscpld.in","r");
    out=fopen("pscpld.out","w");
    read();
    solve();
    return 0;
}