Cod sursa(job #2395073)

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