Cod sursa(job #1962228)

Utilizator TonisonIlle Antoniu Nicolae Tonison Data 11 aprilie 2017 17:31:41
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nod{
    char ch;
    int nr_ap, exact;
    nod *fiu[26];
};
void inserare(nod *p, string s){
    if(!p->fiu[s[0]-'a']){
        p->fiu[s[0]-'a']=new nod{};
        p=p->fiu[s[0]-'a'];
        p->nr_ap=1;
        p->ch=s[0];
    }
    else{
        p=p->fiu[s[0]-'a'];
        p->nr_ap++;
    }
    for(int i=1; i<s.length(); ++i){
        if(!p->fiu[s[i]-'a']){
            p->fiu[s[i]-'a']=new nod{};
            p=p->fiu[s[i]-'a'];
            p->nr_ap=1;
            p->ch=s[i];
        }
        else{
            p=p->fiu[s[i]-'a'];
            p->nr_ap++;
        }
    }
    p->exact++;
}

void stergere(nod *p, string s){
    for(int i=0; i<s.length(); ++i){
        p=p->fiu[s[i]-'a'];
        p->nr_ap--;
    }
    p->exact--;
}

void aparitii(nod *p, string s){
    for(int i=0; i<s.length(); ++i){
        p=p->fiu[s[i]-'a'];
    }
    g<<p->exact<<"\n";
}
void prefix(nod *p, string s){
    for(int i=0; i<s.length(); ++i){
        if((!p->fiu[s[i]-'a']) || (p->fiu[s[i]-'a']->nr_ap==0)){
            g<<i<<"\n";
            return;
        }
        p=p->fiu[s[i]-'a'];
     //g<<p->ch<<" ";
    }
    g<<s.length()<<"\n";
}
int main()
{
    string s;
    short q;
    nod *rad=new nod{};
    while(f>>q>>s){
        if(q==0){
            inserare(rad,s);
        }
        if(q==1){
            stergere(rad,s);
        }
        if(q==2){
            aparitii(rad,s);
        }
        if(q==3){
            prefix(rad,s);
        }
    }
    return 0;
}