Cod sursa(job #2875308)

Utilizator k2y201342asdfadfsafsd k2y20 Data 21 martie 2022 13:25:55
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>
using namespace std;

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

const int SIGMA=26;

struct trie
{
    trie *fii[SIGMA];
    int nrFii,frecv;

    trie()
    {
        nrFii=0,frecv=0;
        for(int i=0;i<SIGMA;i++) fii[i]=NULL;
    }
};

trie *T=new trie;

void Insert(trie *nod,char *s)
{
    if(*s == '\0')
    {
        nod->frecv++;
        //cout<<'a';
        //cout<<nod->frecv<<'\n';
        return;
    }

    if(nod->fii[*s-'a'] == NULL)
    {
        nod->fii[*s-'a']=new trie;
        nod->nrFii++;
    }
    Insert(nod->fii[*s-'a'], s+1);
}

bool Delete(trie *nod,char *s)
{
    if(*s =='\0') nod->frecv--;
    else if(nod->fii[*s-'a'] != NULL && Delete(nod->fii[*s-'a'],s+1))
        {
            nod->fii[*s-'a']=NULL;
            nod->nrFii--;
        }
    if(nod->nrFii == 0 && nod->frecv == 0 && nod!=T)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int Query(trie *nod,char *s)
{
    if(*s=='\0') return nod -> frecv;
	else if(nod -> fii[*s-'a'] != NULL) return Query(nod -> fii[*s-'a'], s+1);
	return 0;
}

int Prefix(trie *nod, char *s, int lungime)
{
    if(*s == '\0' || nod->fii[*s-'a'] == NULL) return lungime;
    return Prefix(nod->fii[*s-'a'],s+1,lungime+1);
}

int main()
{
    int x;
    char c[21];
    while(in>>x>>c)
    {
        switch(x)
        {
            case 0: Insert(T,c);break;
            case 1: Delete(T,c);break;
            case 2: out<<Query(T,c)<<'\n' ;break;
            case 3: out<<Prefix(T,c,0)<<'\n';break;
        }
    }
}