Cod sursa(job #1640676)

Utilizator gapdanPopescu George gapdan Data 8 martie 2016 18:51:11
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <fstream>
#include <cstring>
#define NMAX 1000

using namespace std;

char s[50];
int t;
struct trie
{
    int nr1,nr2;
    trie *nod[27];
    trie()
    {
        nr1=0;nr2=0;
        memset(nod,0,sizeof(nod));
    }
}*root;

void add(trie *rad,int poz)
{
    int p;
    if(s[poz] == '\0')
    {
        rad->nr1++;
        return;
    }
    if(rad->nod[s[poz]-'a'] == NULL)
    {
        rad->nod[s[poz]-'a']=new trie();
        rad->nr2++;
    }
    p=poz+1;
    add(rad->nod[s[poz]-'a'],p);
}

bool sterge(trie *rad, int poz)
 {
    if(s[poz] == '\0')
    {
        rad->nr1--;
        if(rad->nr1 == 0 && rad->nr2 == 0 && rad!=root)
        {
            rad=NULL;
            return 1;
        }
        return 0;
    }
    int p=poz+1;
    if(sterge(rad->nod[s[poz]-'a'],p))
    {
        rad->nr2--;
        if(rad->nr2 == 0 && rad->nr1 == 0 && rad!=root)
        {
            rad=NULL;
            return 1;
        }
        return 0;
    }
 }

 int apar(trie *rad,int poz)
 {

    if(s[poz] == '\0')
    {
        return rad->nr1;
    }
    int p=poz+1;
    if(rad->nod[s[poz]-'a'] != NULL) return(apar(rad->nod[s[poz]-'a'],p));
        else return 0;
 }

 int aparpref(trie *rad,int poz)
 {
    if(s[poz] == '\0')
    {
        return 0;
    }
    int p=poz+1;
    if(rad->nod[s[poz]-'a'] != NULL) return 1+aparpref(rad->nod[s[poz]-'a'],p);
        else return 0;
 }
int main()
{
    ifstream f("trie.in");
    ofstream g("trie.out");
    root = new trie;
    while(f>>t)
    {
        f.get();
        f.getline(s,NMAX);
        if (t == 0)
        {
            add(root,0);
        }
        else if (t == 1)
        {
            sterge(root,0);
        }
        else if (t == 2)
        {
            g<<apar(root,0)<<"\n";
        }
        else
        {
            g<<aparpref(root,0)<<"\n";
        }
    }
}