Cod sursa(job #2081192)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 4 decembrie 2017 12:21:16
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <cstring>

using namespace std;

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

int n, tip, sol;

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

char sir[30];

void init(node *r){
    r->ok = 0;
    r->info = 0;
    for(int i = 0; i <= 26; ++ i)
        r->v[i] = NULL;
}

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

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

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

void lng(node *r, int poz){
    if(r->v[sir[poz] - 'a'] == NULL || poz == n){
        sol = poz;
        return;
    }
    lng(r->v[sir[poz] - 'a'], poz + 1);
}

int main()
{
    r = NULL;
    while(f>>tip){
        f>>sir + 1;
        n = strlen(sir + 1);
        switch(tip){
            case 0: add(r, 1); break;
            case 1: rmv(r, 1); break;
            case 2: sol = 0; cnt(r, 1); g<<sol<<'\n'; break;
            case 3: sol = 0; lng(r, 1); g<<sol<<'\n'; break;
        }
    }
    return 0;
}