Cod sursa(job #1649708)

Utilizator maribMarilena Bescuca marib Data 11 martie 2016 14:44:23
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include <fstream>
#include <cstring>

using namespace std;

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

char sir[25];

int com, lung;

struct trie {
    int sons, count;
    trie *fiu[26];
    
    trie() {
        count = 0, sons = 0;
        for(int i = 0; i < 26; ++i)  fiu[i] = 0;
    }
};

trie *root = new trie;

void insert(trie *node, int pos){
    int ind;
    if(pos == lung)
        node -> count++;
    else {
        ind = (int)(sir[pos] - 'a');
        if(!(node -> fiu[ind])){
            node -> fiu[ind] = new trie;
            node -> sons++;
        }
        insert(node -> fiu[ind], pos + 1);
    }
}

int sterge(trie *node, int pos){
    int deleted, ind;
    if(pos == lung){
        node -> count--;
    }
    else {
        ind = (int)(sir[pos] - 'a');
        deleted = sterge(node -> fiu[ind], pos + 1);
        if(deleted){
            node -> sons--;
            node -> fiu[ind] = 0;
        }
    }
    if(!(node -> count) && node != root && !(node -> sons)){
        delete node; return 1;
    }
    return 0;
}

int result;

int longest_prefix(trie *node, int pos){
    int ind;
    if(pos < lung){
        ind = (int)(sir[pos] - 'a');
        if(node -> fiu[ind]){
            result++;
            longest_prefix(node -> fiu[ind], pos + 1);
        }
    }
    return result;    
}

int how_many_times(trie *node, int pos){
    int ind;
    if(pos == lung)
        return node -> count;
    ind = (int)(sir[pos] - 'a');
    if(node -> fiu[ind])
        how_many_times(node -> fiu[ind], pos + 1);
    else return 0;
}

int main()
{   
    int x;
    while(in >> com){
        in.get();
        in.get(sir, 22);
        lung = strlen(sir);
        if(com == 0)
            insert(root, 0);
        if(com == 1)
            com = sterge(root, 0);
        if(com == 2)
            out<<how_many_times(root, 0);
        if(com == 3)
            out<<longest_prefix(root, 0);
        if(com >= 2) out<<"\n";
        result = 0;
    }
    in.close();
    out.close();
    return 0;
}