Cod sursa(job #1098767)

Utilizator StexanIarca Stefan Stexan Data 5 februarie 2014 10:04:00
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <cstdio>
#include <cstring>
using namespace std;

char Text[35];

struct TRIE
{
    TRIE *Fiu[26];
    int NrFii,NrAparitii;
    TRIE(){
        NrFii = 0;
        NrAparitii = 0;
        for(int i = 0; i < 26; i++){
            Fiu[i] = 0;
        }
    }
};
TRIE *T = new TRIE;

inline int Code(char C)
{
    return ((int)C - (int)'a');
}

void Insert(TRIE *Node, char *Letter){
    if (*Letter == '\n') {
        Node -> NrAparitii++;
        return;
    }
    int C = Code(*Letter);
    if (Node -> Fiu[C] == NULL) {
        Node->NrFii++;
        Node->Fiu[C] = new TRIE;
    }
    Insert(Node->Fiu[C], Letter+1);
}

int Query(TRIE *Node, char *Letter){
    if (*Letter == '\n') {
        return Node->NrAparitii;
    }
    int C = Code(*Letter);
    if (Node -> Fiu[C]) {
        return Query(Node->Fiu[C], Letter+1);
    }
    return 0;
}
int Prefix(TRIE *Node, char *Letter, int count){
    if (*Letter == '\n') {
        return count;
    }
    int C = Code(*Letter);
    if (Node -> Fiu[C] == 0) {
        return count;
    }
    return Prefix(Node->Fiu[C], Letter+1, count+1);
}

int Delete(TRIE *Node, char *Letter){
    if (*Letter == '\n') {
        Node->NrAparitii--;
    }else{
            int C = Code(*Letter);
            if(Delete(Node->Fiu[C], Letter+1)){
                Node->Fiu[C] = 0;
                Node->NrFii--;
            }
    }
    if (Node->NrFii == 0 && Node->NrAparitii == 0) {
        delete Node;
        return 1;
    }
    return 0;
}
void Read(){
    freopen( "trie.in", "r", stdin );
    freopen( "trie.out", "w", stdout );
    
    while( fgets( Text, 35, stdin ) ) {
        if (Text[0] == '0') {
            Insert(T, Text+2);
            
        }else if (Text[0] == '1') {
            Delete(T, Text+2);
            
        }else if (Text[0] == '2') {
            printf("%d\n", Query(T, Text+2));
            
        }else if (Text[0] == '3') {
             printf("%d\n", Prefix(T, Text+2, 0));
            
        }
    }
}
int main()
{
    Read();
    return 0;
}