Cod sursa(job #2753011)

Utilizator ioana0211Ioana Popa ioana0211 Data 20 mai 2021 18:15:04
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
struct trie{
    int cuv, prefix;
    trie *copii[26];
    trie(){
        cuv=0; prefix=0;
        for(int i=0; i<26; i++) copii[i]=0;
    }
};

void adaugare (trie *rad, char *c, int poz)
{
    rad->prefix++;
    if(poz==strlen(c)){
        rad->cuv++;
        return;
    }
    int lit=c[poz]-'a';
    if(rad->copii[lit]==0)
        rad->copii[lit]=new trie;
    adaugare(rad->copii[lit], c, poz+1);
}
void stergere (trie *rad, char *c, int poz)
{
    rad->prefix--;
    if(poz==strlen(c)){
        rad->cuv--;
        return;
    }
    int lit=c[poz]-'a';
    stergere(rad->copii[lit], c, poz+1);
}
int nr_aparitii (trie *rad, char *c, int poz)
{
    if(poz==strlen(c))
        return rad->cuv;
    int lit=c[poz]-'a';
    if(rad->copii[lit]==0 || rad->copii[lit]->prefix==0)
        return 0;
    return nr_aparitii(rad->copii[lit], c, poz+1);
}
int lung_prefix_comun (trie *rad, char *c, int poz)
{
    if(poz==strlen(c))
        return strlen(c);
    int lit=c[poz]-'a';
    if(rad->copii[lit]==0 || rad->copii[lit]->prefix==0)
        return poz;
    return lung_prefix_comun(rad->copii[lit], c, poz+1);
}
int main()
{
    trie *rad=new trie;
    int op; char ch[21];
    while(fin>>op>>ch)
    {
        switch(op){
            case 0: adaugare(rad, ch, 0); break;
            case 1: stergere(rad, ch, 0); break;
            case 2: fout<<nr_aparitii(rad, ch, 0)<<"\n"; break;
            case 3: fout<<lung_prefix_comun(rad, ch, 0)<<"\n"; break;
        }
    }
    return 0;
}