Cod sursa(job #1412299)

Utilizator BaTDucKMocanu George BaTDucK Data 1 aprilie 2015 11:17:43
Problema Trie Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<bits/stdc++.h>

using namespace std;

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

    Trie() {
        cnt = End = 0;
        for(int i = 0; i < 26; ++ i)
            fiu[i] = NULL;
    }
};

Trie *T = new Trie;
char sir[50];

void Insert(Trie *Q)
{
    for(int i = 0; sir[i]; ++ i) {
        int CH = sir[i] - 'a';

        if(!Q->fiu[CH])
            Q->fiu[CH] = new Trie;

        Q = Q->fiu[CH];
        Q->cnt ++;
    }

    Q->End ++;

}

void Erase(Trie *Q, int i)
{
    -- Q->cnt;

    if(!sir[i]) {
        -- Q->End;
        return ;
    }

    Erase(Q->fiu[sir[i] - 'a'], i + 1);
}

int Query_1(Trie *Q)
{
    for(int i = 0; sir[i]; ++ i) {
        int CH = sir[i] - 'a';
        if(!Q->fiu[CH])
            return 0;
        Q = Q->fiu[CH];
    }

    return Q->End;
}

int Query_2(Trie *Q)
{
    int i;
    for(i = 0; sir[i]; ++ i) {
        int CH = sir[i] - 'a';
        if(!Q->fiu[CH])
            return i;
        Q = Q->fiu[CH];
        if(Q->cnt <= 1)
            return i + 1;
    }
    return i;
}

int main()
{
    freopen("trie.in" ,"r", stdin);
    freopen("trie.out", "w", stdout);

    int tip;

    while(cin >> tip){

        cin >> sir;

        //cout << tip << " " << sir << "\n";
        if(tip == 0)
            Insert(T);

        if(tip == 1)
            Erase(T, 0);

        if(tip == 2)
            printf("%d\n", Query_1(T));

        if(tip == 3)
            printf("%d\n", Query_2(T));

    }

    return 0;
}