Cod sursa(job #2395046)

Utilizator patcasrarespatcas rares danut patcasrares Data 2 aprilie 2019 10:20:03
Problema PScPld Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.9 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++)
    {
        while(s[i]!=s[i-1-r[z].l])
            z=r[z].pr;
        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;
        z=r[z].pr;
        while(s[i]!=s[i-1-r[z].l])
            z=r[z].pr;
        r[m].pr=z;
        z=m;
        r[z].fr++;
    }
    for(int i=2;i<=m;i++)
        sol+=1LL*r[i].l*r[i].fr;
    fout<<sol;
}