Cod sursa(job #1003368)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 30 septembrie 2013 15:59:03
Problema PScPld Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include<stdio.h>
#include<string.h>
#include<algorithm>

#define LL long long
#define NMAX 1000007

using namespace std;

LL Ans;
int D[NMAX], A[NMAX], Last;
char a[NMAX];

int main(){
    freopen("pscpld.in", "r", stdin);
    freopen("pscpld.out", "w", stdout);
    gets(a);
    for(int i = 0; i < strlen(a); ++ i){
        A[++ A[0]] = a[i] - 96;
        A[++ A[0]] = 100;
    }
    A[++ A[0]] = 100;
    for(int i = 1; i <= A[0]; ++ i){
        if(i == 1){
            D[i] = 1;
            Last = 1;
        }
        else
            D[i] = max(min(D[Last - (i - Last)] - 1, Last + D[Last] - i), 1);
        int St = i - D[i], Dr = i + D[i];
        while(St > 0 && Dr <= A[0] && A[St] == A[Dr]){
            ++ D[i];
            -- St;
            ++ Dr;
        }
        if(A[i] == 100)
            Ans += D[i] / 2;
        else
            Ans += (D[i] + 1) / 2;
        if(i + D[i] > Last + D[i])
            Last = i;
    }
    printf("%lld", Ans);
}