Cod sursa(job #2079040)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 30 noiembrie 2017 14:33:48
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <fstream>
#include <string>

using namespace std;

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

int n, tip;

string sir;

struct node{
    int info, complet;
    node *v[26];
};

void add(node *r, int poz, string sir){
    if(r->v[sir[poz] - 'a'] == NULL){
        ++ r->complet;
        r->v[sir[poz] - 'a'] = new node;
        for(int i = 0; i <= 26; ++ i)
            r->v[sir[poz] - 'a']->v[i] = NULL;
    }
    if(poz < sir.size())
        add(r->v[sir[poz] - 'a'], poz + 1, sir);
    if(poz == sir.size())
        r->info += 1;
}

int rmv(node *r, int poz, string sir){
    int ok = 0;
    if(poz < sir.size())
        ok = rmv(r->v[sir[poz] - 'a'], poz + 1, sir);
    if(poz == sir.size()){
        r->info -= 1;
        if(r->info == 0)
            r->complet -= 1;
        if(r->complet == 0)
            return 0;
        else
            return 1;
    }
    if(ok == 0){
        delete r->v[sir[poz] - 'a'];
        r->v[sir[poz] - 'a'] = NULL;
        r->complet -= 1;
    }
    return r->complet;
}

int cnt(node *r, int poz, string sir){
    if(poz < sir.size() && r->v[sir[poz] - 'a'] == NULL)
        return 0;
    if(poz < sir.size())
        return cnt(r->v[sir[poz] - 'a'], poz + 1, sir);
    if(poz == sir.size())
        return r->info;
}

int prefix(node *r, int poz, string sir, int nivel){
    if(r->v[sir[poz] - 'a'] != NULL && poz <= sir.size())
        return prefix(r->v[sir[poz] - 'a'], poz + 1, sir, nivel + 1);
    return nivel;
}

int main()
{
    node *r = new node;
    for(int i = 0; i <= 26; ++ i)
        r->v[i] = NULL;
    while(f>>tip){
        f>>sir;
        if(tip == 0)
            add(r, 0, sir);
        if(tip == 1)
            rmv(r, 0, sir);
        if(tip == 2)
            g<<cnt(r, 0, sir)<<'\n';
        if(tip == 3)
            g<<prefix(r, 0, sir, 0)<<'\n';
    }
    return 0;
}