Cod sursa(job #2089289)

Utilizator vancea.catalincatalin vancea.catalin Data 16 decembrie 2017 12:25:35
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<iostream>
#include<string>
#include<fstream>
#include<cmath>
#include<cstring>
using namespace std;
fstream fin("trie.in",ios::in), fout("trie.out",ios::out);
char s[50];
struct trie
{
    int cnt,ap;
    trie *fiu[27];
    trie()
    {
        cnt=ap=0;
        memset(fiu,0,sizeof(fiu));
    }
};

void add_trie(char *s, trie *t)
{
	t->ap++;
    if(*s == NULL)
    {
        t->cnt++;
        return ;
    }
    int delta= *s-'a';
    if(t->fiu[delta]==NULL)
    {
        t->fiu[delta]=new trie();
    }
    add_trie(s+1,t->fiu[delta]);
}

void delete_trie(char *s, trie *t)
{
	t->ap--;
    if(*s == NULL)
    {
        t->cnt--;
        return ;
    }
    int delta= *s-'a';
    delete_trie(s+1,t->fiu[delta]);
}

int find_trie(trie *nod, char *s)
{
    if(*s == NULL) return nod->cnt;
    int delta=*s-'a';
    if(nod->fiu[delta] == NULL) return 0;
    return find_trie(nod->fiu[delta],s+1);
}

int search_trie(char *s, trie *nod)
{
	if(*s == NULL) return 1;
	int delta = *s-'a';
	if(nod->ap == 0) return 0;
	if(nod->fiu[delta]==NULL)
    {
        return 1;
    }
	
	return (search_trie(s+1,nod->fiu[delta])+1);
}
int main()
{
    int op;
    trie *root = new trie;
    while(fin>>op)
    {
        fin>>s;
        if(op==0)
        {
            add_trie(s,root);
        }
        if(op==1) //delete
        {
            delete_trie(s, root);
        }
        if(op==2) //find
        {
            fout<<find_trie(root, s)<<"\n";
        }
        if(op==3)
        {
            fout<<search_trie(s, root)-1<<"\n";
        }
    }
}