Cod sursa(job #1864799)

Utilizator mihai.alphamihai craciun mihai.alpha Data 1 februarie 2017 00:10:57
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <fstream>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cctype>

using namespace std;

#define Ch *s - 'a'

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

struct Trie  {
    int cnt, nrfii;
    Trie *fiu[26];

    Trie()  {
        nrfii = cnt = 0;
        memset(fiu, 0, sizeof(fiu));
    }
};

Trie *mytrie = new Trie;

void ins(Trie *nod, char *s)  {
    if(*s == NULL)  {
        nod -> cnt++;
        return;
    }
    if(nod -> fiu[Ch] == 0)  {
        nod -> fiu[Ch] = new Trie;
        nod -> nrfii++;
    }

    ins(nod -> fiu[Ch], s + 1);
}

bool del(Trie *nod, char *s)  {
    if(*s == NULL)  {
        nod -> cnt--;
    }
    else if(del(nod -> fiu[Ch], s + 1))  {
        nod -> fiu[Ch] = 0;
        nod -> nrfii--;
    }

    if(nod -> cnt == 0 && nod -> nrfii == 0 && nod != mytrie)  {
        delete nod;
        return true;
    }

    return false;
}

int ask(Trie *nod, char *s)  {
    if(*s == NULL)  {
        return nod -> cnt;
    }

    if(nod -> fiu[Ch])  {
        return ask(nod -> fiu[Ch], s + 1);
    }

    return 0;
}

int prefix(Trie *nod, char *s, int nr)  {
    if(*s == NULL || nod -> fiu[Ch] == 0)
        return nr;

    return prefix(nod -> fiu[Ch], s + 1, nr + 1);
}

char cuv[25];


int main()  {
    int x;
    fin >> x >> cuv;

    while(!fin.eof())  {

        switch(x)  {
            case 0:
            ins(mytrie, cuv);
            break;
            case 1:
            del(mytrie, cuv);
            break;
            case 2:
            fout << ask(mytrie, cuv) << '\n';
            break;
            case 3:
            fout << prefix(mytrie, cuv, 0) << '\n';
            break;
        }

        fin >> x >> cuv;
    }

    fin.close();
    fout.close();

    return 0;
}