Cod sursa(job #810356)

Utilizator ahmed.abdraboahmed.abdrabo ahmed.abdrabo Data 10 noiembrie 2012 10:36:03
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <set>
#include <string>
#include <cstdio>
#include <algorithm>

using namespace std;

struct node {
	int end, prefix;
	node * child[26];
}* Trie;

void add(const string & s) {
	node * current = Trie;
	for (size_t i = 0; i < s.size(); i++) {
		int c = s[i] - 'a';
		if (current->child[c] == 0) {
			current->child[c] = new node;
		}
		current = current->child[c];
		current->prefix++;
	}
	current->end++;
}

void remove(const string & s) {
	node * current = Trie;
	for (size_t i = 0; i < s.size(); i++) {
		int c = s[i] - 'a';
		current = current->child[c];
		current->prefix--;
	}
	current->end--;
}

int count(const string & s) {
	node * current = Trie;
	for (size_t i = 0; i < s.size(); i++) {
		int c = s[i] - 'a';
		if (current->child[c] == 0 || current->child[c]->prefix == 0) {
			return 0;
		}
		current = current->child[c];
	}
	return current->end;
}

int lcp(const string & s) {
	node * current = Trie;
	for (size_t i = 0; i < s.size(); i++) {
		int c = s[i] - 'a';
		if (current->child[c] == 0 || current->child[c]->prefix == 0) {
			return i;
		}
		current = current->child[c];
	}
	return s.size();
}

int n;
char str[128];

int main() {
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);
	Trie = new node;
	while (scanf("%d %s", &n, str) == 2) {
		string s(str);
		if (n == 0) {
			add(s);
		}
		if (n == 1) {
			remove(s);
		}
		if (n == 2) {
			printf("%d\n", count(s));
		}
		if (n == 3) {
			printf("%d\n", lcp(s));
		}
	}
	return 0;
}