Cod sursa(job #824865)

Utilizator ahmed.abdraboahmed.abdrabo ahmed.abdrabo Data 27 noiembrie 2012 03:26:09
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <set>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

struct node {
	int end, prefix;
	int child[26];
	node() {
		end = prefix = 0;
		memset(child, -1, sizeof child);
	}
};

node Trie[1 << 12];
int node_count;

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

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

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

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

int n;
char str[128];

int main() {
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);
	node_count++;
	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;
}