Cod sursa(job #3207714)

Utilizator hhhhhhhAndrei Boaca hhhhhhh Data 26 februarie 2024 19:45:20
Problema PScPld Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("pscpld.in");
ofstream fout("pscpld.out");
typedef long long ll;
struct node
{
    int kids[26];
    int lg,suflink;
    int cnt;
} emp;
int r1,r2;
vector<node> t;
string s;
int last;
int newnode()
{
    int val=t.size();
    t.push_back(emp);
    return val;
}
bool comp(int a,int b)
{
    return t[a].lg>t[b].lg;
}
void add(int poz)
{
    int me=last;
    int c=s[poz]-'a';
    while(true)
    {
        int p=poz-t[me].lg-1;
        if(p>=0&&s[p]==s[poz])
            break;
        me=t[me].suflink;
    }
    if(t[me].kids[c]!=-1)
    {
        last=t[me].kids[c];
        t[last].cnt++;
        return;
    }
    last=newnode();
    t[me].kids[c]=last;
    t[last].lg=t[me].lg+2;
    t[last].cnt++;
    if(t[me].lg==-1)
    {
        t[last].suflink=r2;
        return;
    }
    me=t[me].suflink;
    while(true)
    {
        int p=poz-t[me].lg-1;
        if(p>=0&&s[p]==s[poz])
            break;
        me=t[me].suflink;
    }
    t[last].suflink=t[me].kids[c];
}
int main()
{
    //ios_base::sync_with_stdio(false);
    //fin.tie(0);
    for(int i=0;i<26;i++)
        emp.kids[i]=-1;
    emp.suflink=-1;
    emp.lg=0;
    emp.cnt=0;
    fin>>s;
    r1=newnode();
    r2=newnode();
    t[r1].lg=-1;
    t[r1].suflink=0;
    t[r2].lg=0;
    t[r2].suflink=0;
    last=r1;
    for(int i=0;i<s.size();i++)
        add(i);
    ll ans=0;
    vector<int> ord;
    for(int i=2;i<t.size();i++)
        ord.push_back(i);
    sort(ord.begin(),ord.end(),comp);
    for(int i:ord)
    {
        ans+=t[i].cnt;
        t[t[i].suflink].cnt+=t[i].cnt;
    }
    fout<<ans;
    return 0;
}