Cod sursa(job #1513666)

Utilizator Andreiii500Andrei Puiu Andreiii500 Data 29 octombrie 2015 20:25:39
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.52 kb
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;

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

struct trie
{
    trie *tata;
    trie *fiu[26];
    int cnt,nrfii;

    trie()
    {
        int i;

        cnt = 0;
        nrfii = 0;
        tata = this;
        for(i=0; i<26; ++i) fiu[i] = NULL;
    }
};

trie *vf = new trie;

void add(char cuv[])
{
    int i,n;
    trie *p, *next;

    p = vf;

    n = strlen(cuv);
    for(i=0; i<n; ++i)
    {
        next = p->fiu[cuv[i] - 'a'];
        if(next != NULL) p = next;
        else
        {
            p->fiu[cuv[i]-'a'] = new trie;
            p->fiu[cuv[i]-'a']->tata = p;
            p->nrfii += 1;
            p = p->fiu[cuv[i]-'a'];
        }
    }
    ++(p->cnt);
}

int aparitii(char cuv[])
{
    int i,n;
    trie *p;

    p = vf;

    n = strlen(cuv);
    i=0;
    while(i<n && p!=NULL)
    {
        p = p->fiu[cuv[i] - 'a'];
        ++i;
    }

    if(p) return p->cnt;
    else return 0;
}

void sterge(char cuv[])
{
    int i,n;
    trie *p, *up;

    p = vf;

    n = strlen(cuv);
    for(i=0; i<n; ++i)
    {
        p = p->fiu[cuv[i] - 'a'];
    }
    --(p->cnt);

    //cout<<cuv<<"\n";
    i = n-1;
    while(p->cnt == 0 && p->nrfii == 0 && p!=vf)
    {
        up = p->tata;
        up -> nrfii -= 1;

        delete up->fiu[cuv[i] - 'a'];
        up->fiu[cuv[i] - 'a'] = NULL;

        p = up;

        --i;


        //cout<<"Sterg: "<<cuv[i]<<"\n";
        //--i;
    }
}


int prefix(char cuv[])
{
    int i,n,maxim;
    trie *p;

    p = vf;

    maxim = 0;

    n = strlen(cuv);
    //cout<<"Caut: " <<cuv<<"\n";cout<<"strlen = "<<n<<"\n\n";

    i=0;
    while(i<n && p != NULL)
    {
        //cout<<"Merg pe ramura: "<<(cuv[i] - 'a')<<"\n";

        //maxim = max(maxim, p->cnt);

        p = p->fiu[cuv[i] - 'a'];
        if(p) ++i;
    }
    //cout<<cuv<<"\n"<<i-1<<"\n\n";
    return i;
}


int main()
{
    char cuv[25];
    int opt;

    trie *p = new trie;
    delete p;

    int cnt=0;
    while(in>>opt)
    {
        in>>cuv;

        if(opt>=2) ++cnt;

        if(cnt==80)
        {
            cout<<opt<<" "<<cuv<<"\n";
            ++cnt;
        }

        //cout<<cuv<<"\n";

        if(opt == 0) add(cuv);
        else if(opt == 1) sterge(cuv);
        else if(opt == 2) out<<aparitii(cuv)<<"\n";
        else out<<prefix(cuv)<<"\n";

        //cout<<cuv<<"\n";
    }

    return 0;
}