Cod sursa(job #2090886)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 18 decembrie 2017 20:16:59
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include<cstring>
using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
char s[30];
int best[140000][26],date[140000],st[140000],vf,rem[140000];
int ev,poz;
void add(int nod)
{
    rem[nod]++;
    if(poz==strlen(s))
    {
        date[nod]++;
        return;
    }
    int val=s[poz]-'a';
    if(best[nod][val]==0)
    {
        if(vf==0)
            st[++vf]=++ev;
        best[nod][val]=st[vf--];
    }
    poz++;
    add(best[nod][val]);
}
void sterge(int nod)
{
    rem[nod]--;
    if(poz==strlen(s))
    {
        date[nod]--;
        return;
    }
    int val=s[poz]-'a';
    poz++;
    sterge(best[nod][val]);
    if(rem[best[nod][val]]==0)
        st[++vf]=best[nod][val],best[nod][val]=0;
}
void write_1 (int nod)
{
    if(poz==strlen(s))
    {
        cout<<date[nod]<<"\n";
        return;
    }
    int val=s[poz]-'a';
    poz++;
    if(best[nod][val]>0)
        write_1(best[nod][val]);
    else
    {
        cout<<0<<"\n";
        return;
    }
}
void write_2 (int nod)
{
    if(poz==strlen(s))
    {
        cout<<poz<<"\n";
        return;
    }
    int val=s[poz]-'a';
    if(best[nod][val]>0)
        poz++,write_2(best[nod][val]);
    else
    {
        cout<<poz<<"\n";
        return;
    }
}
void solve ()
{
    int x;
    while(cin>>x)
    {
        cin>>s;
        poz=0;
        if(x==0)
            add(0);
        if(x==1)
            sterge(0);
        if(x==2)
            write_1(0);
        if(x==3)
            write_2(0);
    }
}
int main()
{
    solve();
    return 0;
}