Cod sursa(job #2089379)

Utilizator geralt_of_riviajohn nathalis geralt_of_rivia Data 16 decembrie 2017 13:59:55
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include<cstring>
using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
char s[30];
int best[100000][26],date[100000],st[100000],vf,rem[100000];
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);
        else if(x==1) sterge(0);
        else if(x==2) write_1(0);
        else if(x==3) write_2(0);
    }
}
int main()
{
    solve();
    cin.close();
    cout.close();
    return 0;
}