Cod sursa(job #851267)

Utilizator Luncasu_VictorVictor Luncasu Luncasu_Victor Data 9 ianuarie 2013 20:05:28
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <deque>
#include <set>
#include <stack>
#include <cassert>
using namespace std;

#define PRO "trie"
void OpenFiles(int EVAL)
{
	if(EVAL)
	{
		char input[100] = PRO, output[100] = PRO;
		freopen(strcat(input, ".in"),"r",stdin);
		freopen(strcat(output,".out"),"w",stdout);
	} else
	{
		freopen("test.in","r",stdin);
		freopen("test.out","w",stdout);
	}
}

#define MAX 100001
#define INF 0xffffff

char a[MAX];
struct trie{
	struct trie * f[26];
	trie(){ for(int i=0;i<26;i++) f[i]=NULL; p=nr=0; }
	int p,nr; }*t;

void add(char *b)
{
	trie *g=t;
	int urm;
	while( isalpha(*b) )
	{
		urm = *b-'a';
		if(g->f[urm]==NULL)g->f[urm]=new trie;
		g=g->f[urm];
		g->p++;
		b++;
	}
	g->nr++;
}

void del(char *b)
{
	trie *g=t;
	int urm;
	while( isalpha(*b) )
	{
		urm = *b-'a';
		g=g->f[urm];
		g->p--;
		b++;
	}
	g->nr--;
}

int app(char *b)
{
	trie *g=t;
	int urm;
	while( isalpha(*b) )
	{
		urm = *b-'a';
		if(g->f[urm]==NULL)return 0;
		g=g->f[urm];
		b++;
	}
	return g->nr;
}

int pre(char *b)
{
	trie *g=t;
	int urm,l=0;
	while( isalpha(*b))
	{
		urm = *b-'a';
		if(g->f[urm]==NULL)return l;
		g=g->f[urm];
		if(g->p<1)return l;
		l++;
		b++;
	}
	return l;
}

int main(int argv,char *args[])
{
	OpenFiles(argv==0);	
	// start
	int op;
	t = new trie;
	while( scanf("%d %s ",&op,a) != -1)
	{
		switch(op)
		{
		case 0: add(a); break;
		case 1: del(a); break;
		case 2: printf("%d\n",app(a)); break;
		case 3: printf("%d\n",pre(a)); break;
		}
	}
	return 0;
}