Cod sursa(job #2022972)

Utilizator DragosBledeaDragos Bledea DragosBledea Data 17 septembrie 2017 20:54:39
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <string>
using namespace std;
ifstream fi("trie.in");
ofstream fo("trie.out");
struct trie
{
    trie *f[26];
    int nrf;
    int cuv;
    trie()
    {
        cuv=0;
        nrf=0;
        for(int i=0;i<=25;i++)
            f[i]=NULL;
    }
};
string s;
void adauga(trie *&p,int poz)
{
    if(p==NULL)
        p=new trie();
    if(poz==s.size())
        p->cuv++;
    else
    {
        p->nrf++;
        adauga(p->f[s[poz]-97],poz+1);
    }
}
void sterge(trie *&p,int poz)
{
    if(poz!=s.size())
        {
            p->nrf--;
            sterge(p->f[s[poz]-97],poz+1);
        }
    else
        p->cuv--;
    if(p->cuv+p->nrf==0)
        delete p,p=NULL;
}
int afisapar(trie *&p, int poz)
{
    if(p==NULL)
        return 0;
    if(poz==s.size())
        return p->cuv;
    else
        return afisapar(p->f[s[poz]-97],poz+1);
}
int lungpref(trie *&p,int poz)
{
    if(poz==s.size())
        return poz;
    if(p->f[s[poz]-97]!=NULL &&
       p->f[s[poz]-97]->cuv+p->f[s[poz]-97]->nrf!=0)
        return lungpref(p->f[s[poz]-97],poz+1);
    else
        return poz;

}
int x;
trie *T=new trie();
int main()
{
    while(fi>>x)
    {
        fi>>s;
        if(x==0)
            adauga(T,0);
        if(x==1)
            sterge(T,0);
        if(x==2)
            fo<<afisapar(T,0)<<'\n';
        if(x==3)
            fo<<lungpref(T,0)<<'\n';
    }
    return 0;
}