Cod sursa(job #2075164)

Utilizator valentinoltyanOltyan Valentin valentinoltyan Data 25 noiembrie 2017 11:39:47
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>
using namespace std;

struct node
{
    int cnt;
    int nrfii=0;
    node *son[27];
    node()
    {
        for(int i=0;i<27;i++)
            son[i]=NULL;
        cnt=0;
    }
};
node*root=new node();
char cuv[21];
void add(node*crt,int ind)
{
    if(cuv[ind]=='\0')
    {
        crt->cnt++;
        return;
    }
    if(crt->son[cuv[ind]-'a']==NULL)
    {
        crt->son[cuv[ind]-'a']=new node();
        crt->nrfii++;
    }
    add(crt->son[cuv[ind]-'a'],ind+1);
}
int caut(node*crt,int ind)
{
    if(cuv[ind]=='\0')
        return crt->cnt;
    if(crt->son[cuv[ind]-'a']==NULL)
        return 0;
    return caut(crt->son[cuv[ind]-'a'],ind+1);

}
int del(node*crt,int ind)
{
    if(cuv[ind]=='\0')
        crt->cnt--;
    else
        if(del(crt->son[cuv[ind]-'a'],ind+1))
        {
            crt->nrfii--;
            crt->son[cuv[ind]-'a']=NULL;
        }
    if(crt->nrfii==0&&crt->cnt==0&&crt!=root)
    {
        delete crt;
        return 1;
    }
    return 0;
}
int prefix(node*crt,int ind)
{
    if(crt==NULL)
        return ind-1;
    if(cuv[ind]=='\0')
        return ind;
    return prefix(crt->son[cuv[ind]-'a'],ind+1);
}
int main()
{
    ifstream f("trie.in");
    ofstream g("trie.out");

    int op;
    f>>op;
    f>>cuv;
    while(!f.eof())
    {
        if(op==0)
            add(root,0);
        else if (op==1)
            del(root,0);
        else if (op==2)
            g<<caut(root,0)<<endl;
        else if (op==3)
            g<<prefix(root,0)<<endl;
        f>>op;
        f>>cuv;
    }
    return 0;
}