Cod sursa(job #3252031)

Utilizator Andrada_MincaAndrada Minca Andrada_Minca Data 28 octombrie 2024 11:18:06
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
//
//  main.cpp
//  TRIE
//
//  Created by Andrada Minca on 28.10.2024.
//

#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct node{
    int cnt;
    int nrfii;
    node* v[26];
    node(){
        cnt=nrfii=0;
        for(int i=0;i<=25;i++)v[i]=NULL;
    }
};
int x;
string s;
node* radacina=new node;
void add(node* nod,string s,int i)
{
    if(i==s.size()){nod->cnt++; return;}
    if(nod->v[s[i]-'a']==NULL){
        nod->v[s[i]-'a']=new node; nod->nrfii++;
    }
    add(nod->v[s[i]-'a'],s,i+1);
}
bool del(node* nod,string s,int i)
{
    if(i==s.size()){nod->cnt--;}
    else if(del(nod->v[s[i]-'a'],s,i+1))
    { nod->v[s[i]-'a']=NULL;nod->nrfii--;}
    if(nod->cnt==0&& nod->nrfii==0&& nod!=radacina){delete nod;return 1;}

    return 0;
}
int nrap(node* nod,string s,int i)
{
    if(i==s.size())return nod->cnt;
    if(nod->v[s[i]-'a']!=NULL)return nrap(nod->v[s[i]-'a'],s,i+1);
    return 0;
}
int prmax(node* nod,string s,int i,int cont)
{
    if(i==s.size())return cont;
    if(nod->v[s[i]-'a']==NULL)return cont;
    return prmax(nod->v[s[i]-'a'],s,i+1,cont+1);
}
int main()
{
    while(fin>>x)
    {
        fin>>s;
        if(x==0)add(radacina,s,0);
        if(x==1)
        {
            del(radacina,s,0);
        }
        if(x==2)fout<<nrap(radacina,s,0)<<'\n';
        if(x==3)fout<<prmax(radacina,s,0,0)<<'\n';
    }
    return 0;
}