Cod sursa(job #1220570)

Utilizator ptquake10ptquake10 ptquake10 Data 17 august 2014 18:14:08
Problema Trie Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <fstream>
#include <map>
using namespace std;
#define MAX 1000001
ifstream f("trie.in");
ofstream g("trie.out");

struct Nod{
	int x;	// nr de match-uri
	int y;	// nr de cuvinte complete
	struct Nod * f[26];	// fii
	Nod() {
		x = 0;
		y = 0;
		memset(f, 0, sizeof(f));
	}
};

struct Trie{
	Nod * varf;
	Trie() {
		varf = new Nod();
	}
	void add(string c) {
		Nod * it = varf;
		int u;
		for (int i = 0; i < c.length(); i++) {
			u = c[i]-'a';
			if (it->f[u] == 0) {
				it->f[u] = new Nod();
			}
			it = it->f[u];
			it->x++;
		}
		it->y++;
	}
	void rem(string c) {
		Nod * it = varf;
		int u;
		for (int i = 0; i < c.length(); i++) {
			u = c[i]-'a'; 
			it = it->f[u];
			it->x--;
		}
		it->y--;
	}
	int app(string c) {
		Nod * it = varf;
		int u;
		for (int i = 0; i < c.length(); i++) {
			u = c[i]-'a';
			if (it->f[u] == 0) {
				return 0;
			}	
			it = it->f[u];	
		}
		return it->y;
	}
	int pre(string c) {
		Nod * it = varf;
		int u, l = 0;
		for (int i = 0; i < c.length(); i++) {
			u = c[i]-'a';
			if (it->f[u] == 0 || it->f[u]->x == 0) return l;
			it = it->f[u];
			l++;
		}
		return l;
	}
} T;

int main() {
	int op;
	string c;
	
	//freopen("inversmodular.out","w",stdout);
		
	while (!f.eof()){
		f >> op >> c;
		switch(op) {
			case 0:
				T.add(c);
				break;
			case 1:
				T.rem(c);
				break;
			case 2:
				g << T.app(c) << "\n";
				break;
			case 3:
				g << T.pre(c) << "\n";
				break;
		}
	}

	return 0;
}