Cod sursa(job #1731819)

Utilizator theo.stoicanTheodor Stoican theo.stoican Data 19 iulie 2016 23:52:47
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>

using namespace std;

struct Trie {
	int cnt, nrfii;
	Trie *fiu[26];

	Trie(){
		cnt = nrfii = 0;
		memset (fiu, 0, sizeof(fiu));
	}
};

Trie *root = new Trie;

void insert (Trie *node, char *word)
{
	if (*word == '\n')
	{
		node->cnt ++;
		return;
	}
	else if (node->fiu[*word-'a'] == 0)
	{
		node->fiu[*word-'a'] = new Trie;
		node->nrfii++;
	}
	insert(node->fiu[*word-'a'], word+1);
}
int del (Trie *node, char *word)
{
	if (*word == '\n')
	{
		node->cnt --;
	}
	else if (del (node->fiu[*word-'a'], word+1)){
		node->fiu[*word-'a'] = 0;
		node->nrfii --;
	}
	if (node->cnt == 0 && node->nrfii == 0 && node != root)
	{
		delete node;
		return 1;
	}
	return 0;
}
int numApp (Trie* node, char* word)
{
	if (*word == '\n')
		return node->cnt;
	if (node->fiu[*word - 'a'] == 0)
		return 0;
	return numApp(node->fiu[*word-'a'], word+1);
}

int prefix (Trie *node, char *word, int k)
{
	if (*word == '\n' || node->fiu[*word-'a'] == 0)
	{
		return k;
	}
	else
		return prefix (node->fiu[*word-'a'],word+1, k+1);
}

int main()
{
	freopen ("trie.in","r", stdin);
	freopen ("trie.out","w", stdout);
	int type;
	char line[32];
	fgets(line, 32, stdin);
	while (!feof(stdin))
	{
		switch (line[0])
		{
			case '0': insert(root, line+2);break;
			case '1': del(root, line+2);break;
			case '2': printf("%d\n", numApp(root, line+2));break;
			case '3': printf("%d\n", prefix(root, line+2, 0));break;
		}
		fgets(line, 32, stdin);
	}
	return 0;
}