Cod sursa(job #2258486)

Utilizator toadehuPuscasu Razvan Stefan toadehu Data 11 octombrie 2018 15:41:05
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.46 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ("trie.in");
ofstream fout ("trie.out");

struct trie
{
    char val;
    int ap;
    vector <int> copii;
} v[2000111];

int a=0;

char ch[333];

void add ()
{
    int cn=0,lg=strlen(ch),cp=0;
    for (int i=0; i<v[cn].copii.size(); ++i)
    {
        if (v[cn].val==ch[2+cp])
        {
            v[cn].ap++;
            cn=v[cn].copii.at(i);
            i=0;
            cp++;
        }
    }
    if (cp+2<lg)
    {
        while (cp+2<lg)
        {
            v[cn].copii.push_back(a+1);
            a+=1;
            v[a].ap+=1;
            v[a].val=ch[cp+2];
            cn=a;
            cp++;
        }
    }
}

void delet ()
{
    int cn=0,lg=strlen(ch),cp=0;
    for (int i=0; i<v[cn].copii.size() && cp+2<lg; ++i)
    {
        if (v[cn].val==ch[2+cp])
        {
            v[cn].ap--;
            cn=v[cn].copii.at(i);
            i=0;
            cp++;
        }
    }
}

void apra()
{
    int cn=0,lg=strlen(ch),cp=0,apr,ln;
    for (int i=0; i<v[cn].copii.size() && cp+2<lg; ++i)
    {
        if (v[cn].val==ch[2+cp])
        {
            //v[cn].ap++;
            apr=v[cn].ap;
            ln=cn;
            cn=v[cn].copii.at(i);
            i=0;
            cp++;
            if (cp==lg-3)
            {
                break;
            }
        }
    }
    int ans=v[ln].ap;
    for (int i=0;i<v[ln].copii.size();++i)
    {
        ans-=v[v[ln].copii.at(i)].ap;
    }
    if (cp==lg-3)
    {
    fout<<ans<<"\n";
    return;
    }
    fout<<0<<"\n";
}

void chibrit ()
{
    int cn=0,lg=strlen(ch),cp=0;
    for (int i=0; i<v[cn].copii.size(); ++i)
    {
        if (v[cn].val==ch[2+cp])
        {
            //v[cn].ap++;
            cn=v[cn].copii.at(i);
            i=0;
            cp++;
        }
        else
        {
            if (i==v[cn].copii.size()-1)
            {
                fout<<cp<<"\n";
                return;
            }
        }
    }
    fout<<cp<<"\n";
}

int main()
{
    while (fin.getline(ch,30))
    {
        switch (ch[0])
        {
        case '0':
            add();
            break;
        case '1':
            delet();
            break;
        case '2':
            apra();
            break;
        case '3':
            chibrit();
            break;
        }
        //memset(ch,0,30);
    }
    cout<<v[0].copii.size();
    return 0;
}