Cod sursa(job #1772213)

Utilizator bleo16783FMI Bleotiu Cristian bleo16783 Data 6 octombrie 2016 16:12:56
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <iostream>
#include<fstream>
#include<cstring>
using namespace std;
int x,l,i,n,q,k;
char w[20];
struct trie
{
    int s,x; //x=numar de aparitii al cuvantului,care se va afla doar la ultima litera;
    //s=numar de fii ai nodului
    trie *v[26];
    trie *t;
    trie()
    {
        for(q=0;q<26;++q)
            v[q]=NULL;
        t=NULL;
        s=0;x=0;
    }
}*vf,*p,*e;
void ad(int n)
{
    p=vf;
    for(i=0;i<n && p->v[ w[i] -'a' ]!=NULL; ++i)
    {
        p=p->v[ w[i] -'a' ];
    }
    for(;i<n;++i)
    {
        ++p->s;
        p->v[ w[i] -'a' ]=new trie;
        p->v[ w[i] -'a' ]->t=p;
        p=p->v[ w[i] -'a' ];
    }
    ++p->x;
}
void del(int n)
{
    p=vf;
    for(i=0;i<n; ++i)
    {
        p=p->v[ w[i] -'a' ];
    }
    --p->x;--i;
    while(p->s<1 && p->t!=NULL && p->x<1)
    {
        e=p;
        p=p->t;
        --p->s;
        p->v[ w[i] -'a' ]=NULL;
        --i;
        delete e;
    }
}
int ap(int n)
{
    p=vf;
    for(i=0;i<n && p->v[ w[i] -'a' ]!=NULL;++i)
    {
        p=p->v[ w[i] -'a' ];
    }
    if(i<n)
    {
        return 0;
    }
    else
    {
        k=p->x;
        return k;
    }
}
int pm(int n)
{
    p=vf;
    for(i=0;i<n && p->v[ w[i] -'a' ];++i)
    {
        p=p->v[ w[i] -'a' ];
    }
    return i;
}
int main()
{
    ifstream f("trie.in");
    ofstream g("trie.out");
    vf=new trie;
    f>>x>>w;n=strlen(w);
    while(!f.eof())
    {
        switch(x)
        {
            case 0:{ad(n);break;}
            case 1:{del(n);break;}
            case 2:{k=ap(n);g<<k<<'\n';break;}
            case 3:{k=pm(n);g<<k<<'\n';break;}
        }
        f>>x>>w;n=strlen(w);
    }
    f.close();
    g.close();
    return 0;
}