Cod sursa(job #810349)

Utilizator ahmed.abdraboahmed.abdrabo ahmed.abdrabo Data 10 noiembrie 2012 10:28:15
Problema Trie Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <set>
#include <string>
#include <cstdio>
#include <algorithm>

using namespace std;

struct node {
	int end, suf;
	node * A[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->A[c] == 0) {
			current->A[c] = new node;
		}
		current = current->A[c];
		current->suf++;
	}
	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->A[c];
		current->suf--;
	}
	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->A[c] == 0 || current->A[c]->suf == 0) {
			delete current->A[c];
			return 0;
		}
		current = current->A[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->A[c] == 0 || current->A[c]->suf == 0) {
			delete current->A[c];
			return i;
		}
		current = current->A[c];
	}
	return s.size();
}

int n;
char str[128];

int main() {
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);
	trie = new node;
	trie->suf = 0;
	trie->end = 0;
	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;
}