Cod sursa(job #1427956)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 3 mai 2015 13:23:03
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include<iostream>
#include<fstream>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<queue>
#include<map>
#include<set>
#include<algorithm>
#include<iomanip>
#include<bitset>
using namespace std;

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

struct trie {
    trie *f[27];
    int nrap, ver;

    trie() {
        nrap = 0;
        ver = 0;
        for(int i = 0; i < 27; ++i)
            f[i] = 0;
    }
};

char a[30];
int siz;
trie rad;

void add(trie *nod, int poz) {
    nod->ver++;
    if(poz == siz) {
        nod->nrap++;
        return;
    }

    if(!nod->f[a[poz]])
        nod->f[a[poz]] = new trie;
    add(nod->f[a[poz]], poz + 1);
}

void del(trie *nod, int poz) {
    nod->ver--;
    if(poz == siz) {
        nod->nrap--;
        return;
    }

    del(nod->f[a[poz]], poz + 1);
}

int nrap(trie *nod, int poz) {
    if(!nod)
        return 0;
    if(poz == siz)
        return nod->nrap;

    return nrap(nod->f[a[poz]], poz + 1);
}

int pref(trie *nod, int poz) {
    if(!nod || !nod->ver)
        return 0;
    if(poz == siz)
        return poz;

    int val = pref(nod->f[a[poz]], poz + 1);
    if(!val)
        return poz;
    else
        return val;
}

int main() {

    int op;

    while(in >> op >> a) {
        siz = strlen(a);
        for(int i = 0; i < siz; ++i)
            a[i] -= 'a';

        if(op == 0)
            add(&rad, 0);
        if(op == 1)
            del(&rad, 0);
        if(op == 2)
            out << nrap(&rad, 0) << "\n";
        if(op == 3)
            out << pref(&rad, 0) << "\n";
    }

    return 0;
}