Cod sursa(job #2595850)

Utilizator armigheGheorghe Liviu Armand armighe Data 8 aprilie 2020 15:45:36
Problema PScPld Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include<fstream>
#include<cstring>
using namespace std;
ifstream f("pscpld.in");
ofstream g("pscpld.out");
char s[1000002],p[2000002];
int n,manacher[2000002];

void Manacher()
{
    int i,st,dr,poz=0,l=0,ll;
    p[1]='*';
    for(i=1;i<=n;i++)
    {
        p[i*2]=s[i];
        p[i*2+1]='*';
    }
    for(i=1;i<=2*n+1;i++)
    {
        if(i>poz+l)
        {
            poz=i;
            l=0;
            st=i-1;
            dr=i+1;
            while(st>=1&&dr<=2*n+1&&p[st]==p[dr])
            {
                st--;
                dr++;
                l++;
            }
            manacher[i]=l;
        }
        else
        {
            if(i+manacher[2*poz-i]<poz+l)
                manacher[i]=manacher[2*poz-i];
            else
            if(i+manacher[2*poz-i]>poz+l)
                manacher[i]=poz+l-i;
            else
            {
                st=i-manacher[2*poz-i]-1;
                dr=poz+l+1;
                ll=0;
                while(st>=1&&dr<=2*n+1&&p[st]==p[dr])
                {
                    st--;
                    dr++;
                    ll++;
                }
                manacher[i]=poz+l-i;
                if(ll!=0)
                {
                    manacher[i]+=ll;
                    poz=i;
                    l=manacher[i];
                }
            }
        }
    }
}

int main()
{
    int i;
    long long sol=0;
    f.getline(s+1,1000001);
    n=strlen(s+1);
    Manacher();
    for(i=1;i<=2*n+1;i++)
    {
        if(p[i]=='*')
            sol+=manacher[i]/2;
        else
            sol+=manacher[i]/2+1;
    }
    g<<sol;
    return 0;
}