Cod sursa(job #2700149)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 26 ianuarie 2021 17:42:42
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

ifstream fin ("trie.in");
ofstream fout ("trie.out");

struct Trie
{
    int nrfii, cnt;
    Trie *fii[26];
    Trie()
    {
        cnt=nrfii=0;
        memset(fii, 0, sizeof(fii));
    }
};
Trie *T=new Trie;

void add(Trie *nod, char *s)
{
    if(*s=='\0')
    {
        nod->cnt++;
        return;
    }
    if(nod->fii[*s-'a']==0)
    {
        nod->fii[*s-'a']=new Trie;
        nod->nrfii++;
    }
    add(nod->fii[*s-'a'], s+1);
}
int del(Trie *nod, char *s)
{
    if(*s=='\0') nod->cnt--;
    else if(del(nod->fii[*s-'a'], s+1))
    {
        nod->fii[*s-'a']=0;
        nod->nrfii--;
    }
    if(nod->nrfii==0&&nod->cnt==0&&nod!=T)
    {
        delete nod;
        return 1;
    }
    return 0;
}
int aparitii(Trie *nod, char *s)
{
    if(*s=='\0') return nod->cnt;
    if(nod->fii[*s-'a']) return aparitii(nod->fii[*s-'a'], s+1);
    return 0;
}
int lungimePrefix(Trie *nod, char *s, int k)
{
    if(*s=='\0' || nod->fii[*s-'a']==0) return k;
    return lungimePrefix(nod->fii[*s-'a'], s+1, k+1);
}

char line[23];
int main()
{
    while(fin.getline(line, 23))
    {
        switch(line[0])
        {
            case '0':
                add(T, line+2);
                break;
            case '1':
                del(T, line+2);
                break;
            case '2':
                fout<<aparitii(T, line+2)<<"\n";
                break;
            case '3':
                fout<<lungimePrefix(T, line+2, 0)<<"\n";
                break;
        }
    }
}