Cod sursa(job #804672)

Utilizator socheoSorodoc Ionut socheo Data 30 octombrie 2012 01:23:37
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <cstdio>
#include <cstring>

using namespace std;

struct Trie{
    int cnt;
    int nrfii;
    Trie *fiu[26];
    Trie(){
        cnt = nrfii = 0;
        memset(fiu, 0, sizeof(fiu));
    }
} *T = new Trie;



void add(Trie *nod, char *w)
{
    if(*w == '\n')
    {
        nod->cnt++;
        return;
    }
    if(nod->fiu[*w - 'a'] == 0)
    {
        nod->fiu[*w - 'a'] = new Trie;
        nod->nrfii++;
    }
    add(nod->fiu[*w - 'a'], w + 1);
}
int sterge(Trie *nod, char *w)
{
    if(*w == '\n')
    {
        nod->cnt--;
    }
    else
        if(sterge( nod->fiu[*w - 'a'], w + 1) == 1)
        {
            nod->fiu[*w - 'a'] = 0;
            nod->nrfii--;
        }
    if(nod->cnt == 0 && nod->nrfii == 0 && nod != T)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int count(Trie *nod, char *w)
{

    if(*w == '\n')
        return nod->cnt;
    else
        if(nod->fiu[*w - 'a'])
            return count(nod->fiu[*w - 'a'], w + 1);
        else return 0;
}
int prefix(Trie *nod, char *w, int k)
{
    if(*w == '\n' ||  nod->fiu[*w - 'a'] == 0)
        return k;
    return prefix(nod->fiu[*w - 'a'], w + 1, k + 1);
}

int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    int nr;
    char sir[32];
    while( !feof(stdin) ) {
		fgets( sir , 32 , stdin);
		if(feof(stdin)) continue;
		if( sir[0] == '0')
			add(T, sir + 2);
		if( sir[0] == '1')
			sterge(T, sir + 2);
		if( sir[0] == '2')
			printf("%d\n",count(T, sir + 2));
		if( sir[0] == '3' )
			printf("%d\n",prefix(T ,sir + 2 , 0));
	}

    return 0;
}