Cod sursa(job #1077097)

Utilizator LizzardStanbeca Theodor-Ionut Lizzard Data 10 ianuarie 2014 21:36:04
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <fstream>

using namespace std;

ifstream fin ("trie.in");
ofstream fout ("trie.out");

struct trie
{
    int nr,cuv;
    trie *next[26];

    trie()
    {
        nr=0;
        cuv=0;
        for(int i=0;i<26;i++)
            next[i]=NULL;
    }
}*root=new trie;

void op0(trie *, char [], int );
int op1(trie *, char [], int );
int op2(trie *, char [], int );
int op3(trie *, char [], int );

int main(void )
{
    int x,n;
    char s[22];

    while(fin && fin>>x)
    {
        fin.get(s,21);
        fin.get();
        switch(x)
        {
        case 0:
            op0(root,s+1,0);
            break;
        case 1:
            x=op1(root,s+1,0);
            break;
        case 2:
            fout<<op2(root,s+1,0)<<"\n";
            break;
        case 3:
            fout<<op3(root,s+1,0)<<"\n";
            break;
        default:
            break;
        }
    }



    return 0;
}

int op3(trie *nod, char s[], int i)
{
    if(s[i]=='\0' || nod->next[s[i]-97]==NULL)
        return i;
    return op3(nod->next[s[i]-97],s,i+1);
}

int op2(trie *nod, char s[], int i)
{
    if(s[i]=='\0')
        return nod->cuv;
    if(nod->next[s[i]-97]!=NULL)
        return op2(nod->next[s[i]-97],s,i+1);
    return 0;
}

int op1(trie *nod, char s[], int i)
{
    if(s[i]=='\0')
        nod->cuv--;
    else if(op1(nod->next[s[i]-97],s,i+1)==1)
    {
        nod->next[s[i]-97]=NULL;
        nod->nr--;
    }

    if(nod->cuv==0 && nod->nr==0 && nod!=root)
    {
        delete nod;
        return 1;
    }

    return 0;
}

void op0(trie *nod, char s[], int i)
{
    if(s[i]=='\0')
    {
        nod->cuv++;
        return;
    }
    if(nod->next[s[i]-97]==NULL)
    {
        nod->next[s[i]-97]=new trie;
        nod->nr++;
    }

    op0(nod->next[s[i]-97],s,i+1);
}