Cod sursa(job #1536197)

Utilizator livliviLivia Magureanu livlivi Data 25 noiembrie 2015 20:19:35
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include<cstdio>
#define N 1000000
using namespace std;

char s[2*N+1];
char aux[N+1];
int dp[2*N+1];

int min(int a,int b){
    return a<b ? a : b;
}

int main(){
    freopen ("pscpld.in","r",stdin);
    freopen ("pscpld.out","w",stdout);
    int n,i,p,m;
    long long cnt;

    gets(aux);

    s[1]='#';
    n=2;
    i=0;
    while(aux[i]!='\n' &&aux[i]!='\0'){
        s[n+1]='#';
        s[n]=aux[i];
        i++;
        n+=2;
    }
    n--;

    p=0;
    m=0;
    cnt=0;
    for(i=1;i<=n;i++){
        if (p<i){
            p=i;
            while(s[p+1]==s[i-(p-i)-1] &&p<n) p++;
            dp[i]=p-i+1;
            m=i;
        }
        else {
            dp[i]=min(dp[m-(i-m)],p-i+1);
            if (i+dp[i]-1==p){
                while(s[p+1]==s[i-(p-i)-1] &&p<n) p++;
                m=i;
                dp[i]=p-i+1;
            }
        }
        cnt=cnt+dp[i]/2;
    }

    printf ("%lld",cnt);
    return 0;
}