Cod sursa(job #1295693)

Utilizator bogdanpaunFMI Paun Bogdan Gabriel bogdanpaun Data 20 decembrie 2014 00:35:05
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

#define N 1000100

char ch[N],v[2*N];
long long h,st,dr,centru ,simetric ,len ,suma;
long long distanta[2*N];

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

    scanf("%s",ch+1);
    len = strlen(ch+1);

    v[0] = '!';  v[2*len] = '@';

    for(int i = 1; i <=len;++i){
        v[++h] = ch[i];
        v[++h] = '#';
    }

    for(int i=1;i < h;++i)
        if( i < dr ){
            simetric = centru - ( i - centru);
            if( distanta[simetric] + i - 1  <  dr ) distanta[i] = distanta[simetric];
            else{
                distanta[i] = dr - i + 1;
                st = i - distanta[i] + 1;
                --st; ++dr;
                while( v[st] == v[dr] ){ ++distanta[i]; ++dr; --st;}
                --dr ; centru = i;
            }
        }else{
                st=dr=i;
                while( v[st] == v[dr] ){ ++distanta[i]; ++dr; --st;}
                --dr;
                centru = i;
        }

    for(int i = 1;i < h ; i+=2) suma += (distanta[i]+1)/2;
    for(int i = 2;i < h ; i+=2) suma +=  distanta[i]   /2;
    printf("%lld",suma);

    return 0;
}