Cod sursa(job #3187594)

Utilizator PostoacaMateiMatei Postoaca PostoacaMatei Data 29 decembrie 2023 17:08:42
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <cstring>
#define cv (*s - 'a') // convert

using namespace std;

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

struct trie {
	struct trienode {
		int nr, nrchild;
		trienode* child[26];

		trienode() {
			nr = nrchild = 0;
			memset(child, 0, sizeof(child));
		}
	};

	trienode* root = new trienode;

	void ins(trienode* node, char* s) {
		if (*s == '\0') {
			node->nr++; return;
		}
		if (node->child[cv] == 0) {
			node->child[cv] = new trienode;
			node->nrchild++;
		}
		ins(node->child[cv], s + 1);
	}

	int del(trienode* node, char* s) {
		if (*s == '\0')
			node->nr--;
		else if (del(node->child[cv], s + 1)) {
			node->child[cv] = 0;
			node->nrchild--;
		}
		if (node->nr == 0 && node->nrchild == 0 && node != root) {
			delete node; return 1;
		}
		return 0;
	}

	int query(trienode* node, char* s) {
		if (*s == '\0')
			return node->nr;
		if (node->child[cv])
			return query(node->child[cv], s + 1);
		return 0;
	}

	int prefix(trienode* node, char* s, int k) {
		if (*s == '\0' || node->child[cv] == 0)
			return k;
		return prefix(node->child[cv], s + 1, k + 1);
	}
};

trie t;

int main() {
	char s[32];
	while (fin.getline(s, 32)) {
		switch (s[0]) {
			case '0': t.ins(t.root, s + 2); break;
			case '1': t.del(t.root, s + 2); break;
			case '2': fout << t.query(t.root, s + 2) << "\n"; break;
			case '3': fout << t.prefix(t.root, s + 2, 0) << "\n"; break;
		}
	}
	return 0;
}