Cod sursa(job #2081585)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 4 decembrie 2017 20:55:43
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <string>

using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

int n, tip;

char sir[100];

struct node{
    int info, ok;
    node *v[26];
    node(){
        info = ok = 0;
        for(int i = 0; i <= 25; ++ i)
            v[i] = 0;
    }
};

void add(node *&r, char *poz){
    if(*poz == 0){
        ++ r->info;
        return;
    }
    if(r->v[*poz - 'a'] == NULL){
        r->v[*poz - 'a'] = new node;
        ++ r->ok;
    }
    add(r->v[*poz - 'a'], poz + 1);
}

void rmv(node *&r, char *poz){
    if(*poz == 0){
        -- r->info;
        if(r->info == 0 && r->ok == 0){
            delete r;
            r = NULL;
        }
        return;
    }
    rmv(r->v[*poz - 'a'], poz + 1);
    if(r->v[*poz - 'a'] == NULL){
        -- r->ok;
        if(r->ok == 0 && r->info == 0){
            delete r;
            r = NULL;
        }
    }
}

int cnt(node *r, char *poz){
    if(*poz == 0)
        return r->info;
    if(r->v[*poz - 'a'] == NULL)
        return 0;
    return cnt(r->v[*poz - 'a'], poz + 1);
}

int lung(node *r, char *poz){
    if(r->v[*poz - 'a'] == NULL || *poz == 0)
        return 0;
    return 1 + lung(r->v[*poz - 'a'], poz + 1);
}

int main()
{
    node *r = new node;
    while(f>>tip){
        f>>sir;
        switch (tip){
            case 0: add(r, sir); break;
            case 1: rmv(r, sir); break;
            case 2: g<<cnt(r, sir)<<'\n'; break;
            case 3: g<<lung(r, sir)<<'\n'; break;
        }
    }
    return 0;
}