Cod sursa(job #1966566)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 15 aprilie 2017 13:07:05
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
# include <fstream>
# include <cstring>
# define DIM 2000010
using namespace std;
ifstream fin("pscpld.in");
ofstream fout("pscpld.out");
char aux[DIM],a[DIM];
int d[DIM],n,i,j,t,mij,dr;
long long sol;
int main () {
    fin>>aux+1;
    n=strlen(aux+1);
    for(i=1;i<=n;i++)
        a[2*i-1]=aux[i];
    for(i=2;i<=2*n-1;i+=2)
        a[i]=98;
    n=2*n-1;
    mij=1;
    dr=1;
    sol=2;
    d[1]=2;
    d[n]=2;
    d[0]=1;
    d[n+1]=1;
    a[0]=98;
    a[n+1]=98;
    for(i=2;i<n;i++){
        if(i>dr){
            for(j=i,t=i;j>=0&&t<=n+1&&a[t]==a[j];j--,t++,d[i]++);
            sol+=d[i]/2;
            mij=i;
            dr=t-1;
            continue;
        }
        d[i]=min(d[2*mij-i],dr-i+1);
        if(d[i]==dr-i+1){
            for(t=dr+1,j=i-d[i];j>=0&&t<=n+1&&a[t]==a[j];j--,t++,d[i]++);
            mij=i;
            dr=t-1;
        }
        sol+=d[i]/2;
    }
    fout<<sol<<"\n";
    return 0;
}