Cod sursa(job #956698)

Utilizator ericptsStavarache Petru Eric ericpts Data 3 iunie 2013 18:05:05
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <cstdio>
using namespace std;

const int MAX_N = 1000100;

char aux[MAX_N];
char s[MAX_N*2 + 100];
int best[MAX_N*2 + 100];
long long show = 0;

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

    scanf("%s",aux);
    int i,cr,j,k;
    bool found;
    int st,dr;
    s[0] = ' ';
    for(i = 0,cr = 1; aux[i] ; ++ i){
        s[cr++] = aux[i];
        s[cr++] = ' ';
    }
    st = dr = 0;
    for(i = 0 ; i < cr ; ){
        while(st >= 0 && dr <= cr && s[st] == s[dr])
            --st,++dr;
        st++,dr--;
        best[i] = dr-st+1;
        found = 0;
        for(j = i-1 ; j >= st; -- j){
            if(j - best[j]/2 == st){
                found = 1;
                int aux = j + best[j]/2;
                st = 2*i-aux;
                i = 2*i-j;
                break;
            }else if(j - best[j]/2 > st){
                best[2*i-j] = best[j];
            }else{
                int aux = j - st;
                best[2*i-j] = aux*2+1;
            }
        }
        if(!found){
            i = dr+1;
            st = dr = i;
        }
    }
    for(i = 0 ; i <cr ; ++ i)
        show += ((best[i])/2 + 1) /2;
    printf("%lld\n",show);
    return 0;
}