Cod sursa(job #2871582)

Utilizator csamoilasamoila ciprian casian csamoila Data 15 martie 2022 09:48:55
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>

using namespace std;

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

struct TrieNode{
    TrieNode *fii[26];
    int nrfii,nrcuv;
    TrieNode(){
        for(int i=0;i<26;i++) fii[i]=0;
        nrfii=nrcuv=0;
    }
};

TrieNode *root = new TrieNode;

void adauga(TrieNode *crawl,char *s){
    if(*s=='\0'){
        crawl->nrcuv++;
        return;
    }
    if(crawl->fii[*s-'a']==0){
        crawl->fii[*s-'a'] = new TrieNode;
        crawl->nrfii++;
    }

    adauga(crawl->fii[*s-'a'],s+1);
}

int sterge(TrieNode *crawl,char *s){
    if(*s=='\0'){
        crawl->nrcuv--;
    }else if(sterge(crawl->fii[*s-'a'],s+1)){
        crawl->nrfii--;
        crawl->fii[*s-'a']=0;
    }

    if(crawl->nrfii==0 && crawl->nrcuv==0 && crawl!=root){
        delete crawl;
        return 1;
    }
    return 0;
}

int nraparitii(TrieNode *nod,char *s){
    if(*s=='\0')
        return nod->nrcuv;
    if(nod->fii[*s-'a'])
        return nraparitii(nod->fii[*s-'a'],s+1);
    return 0;
}

int lungprefix(TrieNode *nod,char *s,int rez){
    if(*s=='\0' or nod->fii[*s-'a']==0)
        return rez;
    return lungprefix(nod->fii[*s-'a'],s+1,rez+1);
}

int main()
{
    int o;
    char w[21];
    while(fin >> o >> w){
        if(o==0) adauga(root,w);
        else if(o==1) sterge(root,w);
        else if(o==2) fout << nraparitii(root,w) << '\n';
        else fout << lungprefix(root,w,0) << '\n';
    }
    return 0;
}