Cod sursa(job #2394791)

Utilizator patcasrarespatcas rares danut patcasrares Data 1 aprilie 2019 22:20:31
Problema PScPld Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("pscpld.in");
ofstream fout("pscpld.out");
const int DN=1e6+5;
int n,l,m,poz,z;
string s;
long long sol;
struct sdf
{
    int l;
    int idx;
    int pr;
    int c[27]={0};
    int fr;
}r[DN];
int main()
{
    getline(fin,s);
    n=s.size();
    s+=" ";
    m=1;
    r[m].idx=m;
    z=m;
    for(int i=1;i<=n;i++)
    {
        while(1)
        {
            if(r[z].l==0)
            {
                if(r[z].c[s[i]-'a']==0)
                {
                    m++;
                    r[z].c[s[i]-'a']=m;
                    r[m].l=1;
                    r[m].pr=z;
                }
                z=r[z].c[s[i]-'a'];
                break;
            }
            poz=i-1-r[z].l;
            if(poz<1)
            {
                z=r[z].pr;
                continue;
            }
            if(s[poz]!=s[i])
            {
                z=r[z].pr;
                continue;
            }
            if(r[z].c[s[i]-'a']==0)
            {
                m++;
                r[z].c[s[i]-'a']=m;
                r[m].l=r[z].l+2;
                r[m].pr=z;
            }
            z=r[z].c[s[i]-'a'];
            break;
        }
        r[z].fr++;
        //cout<<z<<' '<<r[z].fr<<' '<<r[z].l<<'\n';
    }
    for(int i=1;i<=m;i++)
        sol+=1LL*r[i].l*r[i].fr;
    fout<<sol;
}