Cod sursa(job #2696102)

Utilizator BereaBerendea Andrei Berea Data 15 ianuarie 2021 12:38:04
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

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

struct Trie
{
    Trie *fii[30];
    int nrcuv;
    int nrpref;
    Trie()
    {
        for (int i=0;i<=26;i++)
        {
            fii[i]=nullptr;
            nrcuv=0;
            nrpref=0;
        }
    };
};


Trie *rad = new Trie();

void Add(char T[5000]) {
	int n = strlen(T);
	Trie *aux = rad;
	for ( int i = 0; i < n; ++i) {
	if(aux->fii[T[i]-'a'] == nullptr) {
		aux->fii[T[i]-'a'] = new Trie();
}
aux = aux->fii[T[i]-'a'];
aux->nrpref ++;
if(i == n-1)
	aux->nrcuv++;
}

}
void Erase(char T[5000]) {
	int n = strlen(T);
	Trie*aux = rad;
	for ( int i = 0; i < n; ++i) {
		aux = aux->fii[T[i]-'a'];
		if(aux == nullptr)
return;
aux->nrpref--;
if( i == n-1)
	aux->nrcuv--;

}

}

int Query1(char T[5000]) {
	int n  =strlen(T);
	Trie *aux = rad;
	for ( int  i = 0; i < n; ++i) {
		aux  = aux->fii[T[i]-'a'];
		if(aux == nullptr)
			return 0;
		if(i == n-1)
			return aux -> nrcuv;
}
}

int Query2(char T[5000]) {
	int n = strlen(T);
	Trie *aux = rad;
	int lung = 0;
	for ( int i = 0 ; i < n; ++i) {
		aux = aux->fii[T[i]-'a'];
		if(aux == nullptr)
			return lung;
        if (aux->nrpref>0)
		++lung;
}
return lung;
}

char t[5000];

int main()
{
    int x;
    while (cin>>x)
    {
        cin>>t;
        if (x==0) Add(t);
        if (x==1) Erase(t);
        if (x==2) cout<<Query1(t)<<"\n";
        if (x==3) cout<<Query2(t)<<"\n";
    }
}