Cod sursa(job #1627196)

Utilizator AlexandraaaaMereu Alexandra Alexandraaaa Data 3 martie 2016 15:15:36
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <cmath>
#include <string>
#define maxN 100000 + 5

using namespace std;

struct Trie{
	int wor, pref;
	Trie *V[26];

	Trie(){
		wor = pref = 0;
		for (int i = 0; i < 26; ++i)
			V[i] = 0;
	}
}*R;

void insert(string w){
	Trie *p = R;
	for (int i = 0; i < w.size(); ++i){
		int y = w[i] - 'a';
		if (p->V[y] == 0){
			Trie *T = new Trie;
			p->V[y] = T;
		}
		p = p->V[y];
		p->pref++;
		if (i == w.size() - 1)
			p->wor++;
	}
}

void sterge(Trie *p){
	for (int i = 0; i < 26; ++i){
		if (p->V[i] != 0)
			sterge(p->V[i]);
	}
	delete(p);
}

void del(string w){
	Trie *q, *p = R;
	for (int i = 0; i < w.size(); ++i){
		int y = w[i] - 'a';

		q = p->V[y];
		if (p->V[y] == 0)
			return;

		q->pref--;
		if (i == w.size()-1)
			q->wor--;
		if (q->pref == 0){
			p->V[y] = 0;
			sterge(q); 
			return;
		}
		else
			p = q;
	}
}

int num(string w){
	Trie *p = R;
	int s = 0;

	for (int i = 0; i < w.size(); ++i){
		int y = w[i] - 'a';
		if (p->V[y] == 0)
			return 0;
		p = p->V[y];
		s = p->wor;
	}
	
	return s;
}

int lung(string w){
	Trie *p = R;
	int s = 0;

	for (int i = 0; i < w.size(); ++i){
		int y = w[i] - 'a';
		if (p->V[y] == 0)
			return s;
		p = p->V[y];
		s++;
	}
	return s;
}

int main()
{
	ifstream f("trie.in");
	ofstream g("trie.out");

	int x;
	R = new Trie;
	while (f >> x){
		string w;
		f >> w;
		if (x == 0)
			insert(w);
		if (x == 1)
			del(w);
		if (x == 2)
			g << num(w)<<'\n';
		if (x == 3)
			g << lung(w)<<'\n';
	}

	f.close();
	g.close();

	return 0;
}