Cod sursa(job #1728198)

Utilizator xSliveSergiu xSlive Data 12 iulie 2016 14:15:23
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <iostream>
#include <string>
#include <cstring>
#include <fstream>
using namespace std;

class Nod{
public:
    Nod* v[26];
    int freq;
    char litera;
    Nod(char c){
        freq=0;
        litera=c;
        for(int i=0;i<26;i++)
            v[i]=NULL;
    }
    Nod(){
        freq=0;
        litera=' ';
        for(int i=0;i<26;i++)
            v[i]=NULL;
    }
};

void add(Nod* head,char *cuvant){
    for(int i=0;i<(int)strlen(cuvant);i++){
        if(head->v[cuvant[i]-'a'] == NULL)
            head->v[cuvant[i]-'a'] = new Nod(cuvant[i]);
        (head->v[cuvant[i]-'a']->freq)++;
        head = head->v[cuvant[i]-'a'];
    }
}

void sterge(Nod *head,char *cuvant){
    if((int)strlen(cuvant)  > 0){
        (head->v[cuvant[0]-'a']->freq)--;
        sterge(head->v[cuvant[0]-'a'],cuvant+1);
        if(head->v[cuvant[0]-'a'] != NULL && head->v[cuvant[0]-'a']->freq == 0){
            delete head->v[cuvant[0]-'a'];
            head->v[cuvant[0]-'a']=NULL;
        }
    }
}

int count_cuv(Nod*head,char *cuvant){
    int c;
    for(int i=0;i<(int)strlen(cuvant) && head!=NULL;i++)
        head = head->v[cuvant[i]-'a'];
    if(head == NULL)    return 0;
    c=head->freq;
    for(int i=0;i<26;i++)
        if(head->v[i]!=NULL)
            c-=head->v[i]->freq;
    return c;
}

int longest_prefix(Nod *head,char *cuvant){
    if(head->v[cuvant[0]-'a'] == NULL)
        return 0;
    int c =0;
    for(int i=0;i<strlen(cuvant);i++){
        if(head->v[cuvant[i]-'a']!=NULL ){
            c++;
            head = head->v[cuvant[i]-'a'];
        }
        else break;
    }
    return c;
}

Nod* destroy(Nod* head){
    if(head!=NULL){
        for(int i=0;i<26;i++)
            destroy(head->v[i]);
            delete head;
    }
}

int main()
{
    Nod* head =  new Nod;
    ifstream f("trie.in");
    ofstream g("trie.out");
    int nr;
    char cuvant[22];
    while(f >> nr){
        f >> cuvant;
        if(nr == 0)
            add(head,cuvant);
        else if(nr == 1)
            sterge(head,cuvant);
        else if(nr == 2)
            g << count_cuv(head,cuvant) << "\n";
        else
            g << longest_prefix(head,cuvant) << "\n";
    }
    destroy(head);
    return 0;
}