Cod sursa(job #2694719)

Utilizator Hey_HeyIacovlev Denis Hey_Hey Data 10 ianuarie 2021 16:36:55
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include<fstream>
#define Q ( S[i] - 'a' )
#define ui (unsigned int);
using namespace std;

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

	
struct Trie
{
	int end, son;
	Trie *F[26]; // Vector de adreselor fiilor
	
	Trie()
	{
		end=son=0; 
		for(int i=0; i<26; i++) F[i]=0;
		//memset( F, 0, sizeof( F ) );
	}
};

Trie *T = new Trie;
string S;

void add(Trie *nod, ui i)
{
	if(i==S.length()) {nod->end++; return;}
	
	if(nod->F[Q]==0)
	{
		nod->F[Q]= new Trie; //Atribuirea unei adrese 
		nod->son++;
	}
	
	add(nod->F[Q], i+1);
}

int del(Trie *nod, ui i)
{
	if(i==S.length()) nod->end--;
	else
	if(	del(nod->F[Q], i+1 ) )
	{
		nod->F[Q] = 0;
		nod->son --;
	}
	
	if( nod->end == 0 && nod->son == 0 && nod != T ) 
	{
		delete nod; return 1;
	}
	return 0;
}

int query(Trie *nod, ui i)
{
	if(i==S.length()) return nod->end;
	
	if(nod->F[Q]) return query(nod->F[Q], i+1);
	return 0;
}

int prefix(Trie *nod, ui i, int k)
{
	if(i==S.length() || nod->F[Q]==0) return k;
	return prefix(nod->F[Q], i+1, k+1);
}

int main()
{	
	int q;
	while(fi >> q)
	{
		fi >> S;
		switch(q)
		{
			case 0: add( T, 0); break;
			case 1: del( T, 0); break;
			case 2: fo << query( T, 0) << '\n'; break;
			case 3: fo << prefix( T, 0, 0) << '\n'; break;
		}
		
	}
	
	
	return 0;	
}