Cod sursa(job #1653805)

Utilizator leopop29Pop Leonard leopop29 Data 16 martie 2016 16:33:14
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <fstream>
#include <string>
#include <stdlib.h>

using namespace std;

struct tr{
		int trm, ct;
		tr* nxt[26];
		tr(){
				trm = 0;
				ct = 0;
		}
};

string s;
ifstream f("trie.in");
ofstream cout("trie.out");

void ins(tr* n, int p)
{
		if(p == s.size()-1){
				++n->trm; 
				return;
		}
		++n->ct;
		int nt = s[p+1]-'a';
		if(n->nxt[nt] == NULL)
				n->nxt[nt] = new tr();
		ins(n->nxt[nt], p+1);
}

void rm(tr* n, int p)
{
		if(p == s.size()-1){
				--n->trm; 
				if(!n->trm && !n->ct)
						free(n);
				return;
		}
		--n->ct;
		int nt = s[p+1]-'a';
		if(n->nxt[nt] == NULL){
				if(!n->ct && !n->trm)
						free(n);
				return;
		}

		rm(n->nxt[nt], p+1);
		if(!n->ct && !n->trm)
				free(n);
}

void find(tr* n, int p)
{
		if(p == s.size()-1){
				cout << n->trm << '\n';
				return;
		}
		else{
				int nt = s[p+1]-'a';
				if(n->nxt[nt] == NULL)
						n->nxt[nt] = new tr();
				find(n->nxt[nt], p+1);
		}
}

void mpr(tr* n, int p)
{
		if(!n->ct && !n->trm){
				cout << p << '\n';
				return;
		}
		if(p == s.size()-1){
				cout << p+1 << '\n';
				return;
		}
		else{
				int nt = s[p+1]-'a';
				if(n->nxt[nt] == NULL){
						cout << p+1 << '\n';
						return;
				}
				mpr(n->nxt[nt], p+1);
		}
}

int main()
{
		int t;
		tr* r;
		r = new tr();

		f >> t;
		while(!f.eof())
		{
				f >> s;
				switch(t)
				{
					case 0: {
						int st = s[0]-'a';
						if(r->nxt[st] == NULL)
								r->nxt[st] = new tr();
						ins(r->nxt[st], 0);
						break;
					}
					case 1: {
						int st = s[0]-'a';
						if(r->nxt[st] != NULL)
								rm(r->nxt[st], 0);
						break;
				    }
				    case 2: {
						int st = s[0]-'a';
						if(r->nxt[st] == NULL)
								cout << "0\n";
						else
								find(r->nxt[st], 0);
						break;
				    }
					case 3: {
						int st = s[0]-'a';
						if(r->nxt[st] == NULL)
								cout << "0\n";
						else
								 mpr(r->nxt[st], 0);
						break;
				    }
				}
				f >> t;
		}
		
		return 0;
}