Cod sursa(job #3252008)

Utilizator laura2020Moldovan Laura laura2020 Data 28 octombrie 2024 10:51:35
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.97 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");
#define dim 26
struct trie
{
    int cnt,fii;
    trie *v[dim];
    trie()
    {
        cnt=fii=0;
        for(int i=0;i<dim;i++)
        {
            v[i]=NULL;
        }
    }
};
trie *radacina;
void adauga(trie *nod,string s,int i) ///adauga o aparitie a cuvantului s in lista
{
    if(i==s.length())
    {
        nod->cnt++;
        return ;
    }
    int car=s[i]-'a';
    if(nod->v[car]==NULL)
    {
        nod->v[car]=new trie;
        nod->fii++;
    }
    adauga(nod->v[car],s,i+1);
}
int query(trie *nod,string s,int i) ///tipareste numarul de aparitii ale cuvantului s in lista
{
    if(i==s.length())
    {
        return nod->cnt;
    }
    int car=s[i]-'a';
    if(nod->v[car]!=NULL)
        return query(nod->v[car],s,i+1);
    else
        return 0;
}
int prefix(trie *nod,string s) ///tipareste lungimea celui mai lung prefix comun al lui s cu oricare cuvant din lista
{
    int i;
    for(i=0;i<s.length() && nod!=NULL;i++)
    {
        nod=nod->v[s[i]-'a'];
    }
    if(nod==NULL)
        i--;
    return i;
}
int sterge(trie *nod,string s,int i) ///tipareste lungimea celui mai lung prefix comun al lui s cu oricare cuvant din lista
{
    if(i==s.length())
    {
        nod->cnt--;
    }
    else if(sterge(nod->v[s[i]-'a'],s,i+1))
    {
        nod->fii--;
        nod->v[s[i]-'a']=0;
    }
    if(nod->cnt==0 && nod->fii==0 && nod!=radacina)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int main()
{
    string s;
    int op;
    radacina=new trie;
    while(fin>>op>>s)
    {
        switch(op)
        {
        case 0:
            adauga(radacina,s,0);
            break;
        case 1:
            sterge(radacina,s,0);
            break;
        case 2:
            fout<<query(radacina,s,0)<<'\n';
            break;
        case 3:
            fout<<prefix(radacina,s)<<'\n';
            break;
        }
    }
    return 0;
}