Cod sursa(job #810336)

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

using namespace std;

struct node {
	int end, suf;
	node * A[26];
}* trie;

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) {
			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++;
		}
		if (n == 1) {
			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--;
		}
		if (n == 2) {
			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];
			}
			printf("%d\n", current->end);
		}
		if (n == 3) {
			node * current = trie;
			int lcp = 0;
			for (size_t i = 0; i < s.size(); i++) {
				int c = s[i] - 'a';
				if (current->A[c] == 0 || current->A[c]->suf == 0) {
					break;
				}
				lcp++;
				current = current->A[c];
			}
			printf("%d\n", lcp);
		}
	}
	return 0;
}