Cod sursa(job #846400)

Utilizator test_13testing test_13 Data 2 ianuarie 2013 00:35:35
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <cstring>
#include <vector>
using namespace std;
#define Max 100001

struct dic{ 
	struct dic *f[26]; 
	int p,c; 
	dic(){ for(int i=0;i<26;i++)f[i]=NULL; p=c=0; } }*t;

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

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

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

int pre(char *b)
{
	dic *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==0)return l;
		l++;
		b++;
	}
	return l;
}

int main()
{
	char s[25];
	int op;
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
		t=new dic;
		while( scanf("%d %s ",&op,s) != -1)
		{
			switch(op){
				case 0: add(s); break;
				case 1: del(s); break;
				case 2: printf("%d\n",cuv(s)); break;
				case 3: printf("%d\n",pre(s)); break;
			}
		}

	return 0;
}