Cod sursa(job #1754408)

Utilizator AlexandruRudiAlexandru Rudi AlexandruRudi Data 8 septembrie 2016 08:58:57
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <bits/stdc++.h>

using namespace std;

int c; string s;

struct Trie{
    int nr, nrfii;
    Trie *fii[26];

    Trie(){
        nr = nrfii=0;
        for(int i=0;i<=26;i++) fii[i]=0;
    }
};

Trie *T = new Trie;

void add(Trie *nod, char *s){
   if(*s==0){
        nod->nr++;
        return;
   }
   else{
        if(nod->fii[*s-'a']==0){
            nod->fii[*s-'a'] = new Trie;
            nod->nrfii++;
        }
        add(nod->fii[*s-'a'], s+1);
   }
}

bool rem(Trie *nod, char *s){
    if(*s==0){
        nod->nr--;
    }
    else if(rem(nod->fii[*s-'a'],s+1)){
        nod->nrfii--;
        nod->fii[*s-'a']=0;
    }
    if(nod->nr==0 && nod->nrfii==0 && nod!=T){
        delete nod; return 1;
    }
    return 0;
}

int qry(Trie *nod, char *s){
    if(*s==0){
        return nod->nr;
    }
    else{
        if(nod->fii[*s-'a']==0) return 0;
        else{
            return qry(nod->fii[*s-'a'],s+1);
        }
    }
}

int lng(Trie *nod, char *s, int p){
    if(*s==0){
        return p;
    }
    else{
        if(nod->fii[*s-'a']==0) return p;
        else{
            return lng(nod->fii[*s-'a'],s+1,p+1);
        }
    }
}

int main()
{
    ifstream in("trie.in");
    ofstream out("trie.out");
    char a[20];
    in >> c >> s;
    for(int i=0;i<=20;i++) a[i]=0;
    for(int i=0;i<=s.length();i++) a[i]=s[i];
    while(c>-1){
        if(c==0) add(T,a);
        else if(c==1) rem(T,a);
        else if(c==2) out << qry(T,a) << '\n';
        else if(c==3) out << lng(T,a,0) << '\n';
        c=-1;
        in >> c >> s;
        for(int i=0;i<=20;i++) a[i]=0;
        for(int i=0;i<=s.length();i++) a[i]=s[i];
    }
}