Cod sursa(job #3243951)

Utilizator AlexSerban21Serban Alexandru AlexSerban21 Data 22 septembrie 2024 15:15:31
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
int ch;
string sir;
struct trie
{
    int fr;
    trie *urm[26];
    trie ()
    {
        fr=0;
        for (int i=0; i<26; i++)
            urm[i]=NULL;
    }
};
trie *p=new trie;
void add (trie *p,string &sir)
{
    p->fr++;
    for (int i=0; i<sir.size (); i++)
    {
        int nr=sir[i]-'a';
        if (p->urm[nr]==NULL)
            p->urm[nr]=new trie;
        p=p->urm[nr];
        p->fr++;
    }
}
void del (trie *p,string &sir)
{
    p->fr--;
    for (int i=0; i<sir.size (); i++)
    {
        int nr=sir[i]-'a';
        trie *u=p->urm[nr];
        u->fr--;
        if ((p->fr>0||i==0)&&u->fr==0)
            p->urm[nr]=NULL;
        if (p->fr==0&&i>0)
            delete p;
        p=u;
    }
    if (p->fr==0)
        delete p;
}
int ap (trie *p,string &sir)
{
    for (int i=0; i<sir.size (); i++)
    {
        int nr=sir[i]-'a';
        if (p->urm[nr]==NULL)
            return 0;
        p=p->urm[nr];
    }
    int nr=p->fr;
    for (int i=0; i<26; i++)
    {
        if (p->urm[i]!=NULL)
            nr-=p->urm[i]->fr;
    }
    return nr;
}
int pref (trie *p,string &sir)
{
    for (int i=0; i<sir.size (); i++)
    {
        int nr=sir[i]-'a';
        if (p->urm[nr]==NULL)
            return i;
        p=p->urm[nr];
    }
    return sir.size ();
}
int main()
{
    while (fin>>ch>>sir)
    {
        if (ch==0)
            add (p,sir);
        else if (ch==1)
            del (p,sir);
        else if (ch==2)
            fout<<ap (p,sir)<<"\n";
        else
            fout<<pref (p,sir)<<"\n";
    }
    return 0;
}