Cod sursa(job #1831931)

Utilizator PaulStighiStiegelbauer Paul-Alexandru PaulStighi Data 19 decembrie 2016 08:41:02
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<fstream>
#include<iostream>
#include<cstring>
using namespace std;

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

struct Trie
{
    int nr,sons;

    Trie *son[26];

    Trie()
    {
    	nr = sons = 0;
    	memset(son,0,sizeof(son));
    }
};

Trie *T = new Trie;

char Buff[25];

void Add(Trie *nod , char *X)
{
    if(*X == '\0')
	{
		nod->nr++;
		return;
	}

	char chr = *X - 'a';

	if(nod->son[chr] == 0)
	{
		nod->son[chr] = new Trie;
		nod->sons++;
	}

	Add(nod->son[chr],X+1);
}

bool Delete(Trie *nod , char *X)
{
	char chr = *X - 'a';

    if(*X == '\0')	nod->nr--;
    else
		if(Delete(nod->son[chr],X+1))
		{
			nod->son[chr] = 0;
			nod->sons--;
		}

	if(nod->nr == 0 && nod->sons == 0 && nod != T)
	{
		delete nod; return 1;
	}

	return 0;
}

int Search(Trie *nod , char *X)
{
    if(*X == '\0')	return nod->nr;

    char chr = *X - 'a';

    if(nod->son[chr])
		return Search(nod->son[chr],X+1);

	return 0;
}

int Prefix(Trie *nod , char *X , int k)
{
	char chr = *X - 'a';

	if(*X == '\0' || nod->son[chr] == 0)
		return k;

	return Prefix(nod->son[chr],X+1,k+1);
}

int main()
{
    while(fin.getline(Buff,25))
	{
        char cod = Buff[0];

        switch(cod)
        {
			case '0' : Add(T,Buff + 2);	break;
			case '1' : Delete(T,Buff + 2);	break;
			case '2' : fout<<Search(T,Buff + 2)<<"\n"; break;
			case '3' : fout<<Prefix(T,Buff + 2,0)<<"\n";	break;
        }
	}

	fin.close();
	fout.close();
	return 0;
}