Cod sursa(job #1220941)

Utilizator somuBanil Ardej somu Data 19 august 2014 03:26:26
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.93 kb
// 0 w - adauga o aparitie a cuvantului w in lista
// 1 w - sterge o aparitie a cuvantului w in lista
// 2 w - tipareste numarul de aparitii ale cuv. w in lista
// 3 w - tipareste lungimea c.m.l. prefix comun lui w cu oricuarev. din lista
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

#define nmax 21
ifstream in("trie.in");
ofstream out("trie.out");

int tip,Max;
char w[nmax];
bool ok;

typedef struct varf {
    
    int prefix;
    int nra = 0; // nr aparitii
    struct varf *desc[26];
    
}VARF, *TRIE;

TRIE T;

void init(TRIE &T) {
    
    int i;
    T = new VARF;
    for (i=0; i<26; i++)
        T->desc[i] = NULL;
    
}

void adauga(TRIE &T, char C[], int p, long siz, int prev) {
    
    int ind;
    
    if (C[p] == '\0'){
        (T->nra)++;
        return;
    }
    
    if (T == NULL)
        init(T);
    
    ind = int(C[p]-'a');
    
    if (T->desc[ind] != NULL) {
        T->desc[ind]->prefix = prev + 1;
        adauga(T->desc[ind], C, p+1, siz, prev + 1);
    } else {
        init(T->desc[ind]);
        T->desc[ind]->prefix = prev + 1;
        adauga(T->desc[ind], C, p+1, siz, prev + 1);
    }
    
}

void sterge(TRIE &T, char C[], int p, long siz) {
    
    int ind;
    
    if (C[p] == '\0'){
        T->nra--;
        
        if (T->nra == 0) {
            delete(T);
            T = NULL;
        }
        
        return;
    }
    
    ind = int(C[p]-'a');
    
    if (T->desc[ind] != NULL){
        sterge(T->desc[ind], C, p+1, siz);
    }
    
}

void nraparitii(TRIE T, char C[], int p, long siz) {
    
    int ind;
    
    ind = int(C[p]-'a');
    
    if (T->desc[ind] != NULL){
        if (p == siz - 1)
            out << T->desc[ind]->nra << "\n";
        else
            nraparitii(T->desc[ind], C, p+1, siz);
    }
}

void nrPrefix(TRIE T, char C[], int p, long siz) {
    
    int ind;
    
    if (C[p] == '\0')
        return;
    
    ind = int(C[p]-'a');
    
    if (T->desc[ind] != NULL) {
        Max = max(Max, T->desc[ind]->prefix);
        nrPrefix(T->desc[ind], C, p+1, siz);
    }
}

void scrie(TRIE T) {
    
    int i;
    
    if (T == NULL)
        return;
    for (i=0; i<26; i++)
        if (T->desc[i] != NULL)
            cout <<T->desc[i]->prefix;
    
    cout << "\n";
    
    for (i=0; i<26; i++)
        if (T->desc[i] != NULL)
            scrie(T->desc[i]);
}

int main() {
    
    while (!in.eof()) {
        
        in >> tip >> w;
        
        if (tip == 0) {
            
            adauga(T, w, 0, strlen(w), 0);
            
        } else if (tip == 1) {
            
            sterge(T, w, 0, strlen(w));
            
        } else if (tip == 2) {
            
            nraparitii(T, w, 0, strlen(w));
            
        } else {
            
            Max = 0;
            
            nrPrefix(T, w, 0, strlen(w));
            
            out << Max << "\n";
            
        }
        
    }
    
    in.close();
    out.close();
    
    return 0;
}