Cod sursa(job #1003372)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 30 septembrie 2013 16:01:30
Problema PScPld Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include<stdio.h>
#include<string.h>
#include<algorithm>

#define LL long long
#define NMAX 1000007

using namespace std;

LL Ans;
int D[NMAX], Last, Nr;
char a[NMAX], 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[++ Nr] = a[i];
        if(i != strlen(a) - 2)
            A[++ Nr] = '*';
    }
    A[++ Nr] = '*';
    for(int i = 1; i <= Nr; ++ 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 >= 1 && Dr <= Nr && A[St] == A[Dr]){
            ++ D[i];
            -- St;
            ++ Dr;
        }
        if(A[i] == '*')
            Ans += D[i] / 2;
        else
            Ans += (D[i] + 1) / 2;
        if(i + D[i] > Last + D[i])
            Last = i;
    }
    printf("%lld", Ans);
}