Cod sursa(job #3203954)

Utilizator raileanu-alin-gabrielRaileanu Alin-Gabriel raileanu-alin-gabriel Data 15 februarie 2024 07:56:46
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <fstream>
const int NMAX=1005;

using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");

struct trie
{
    int cnt, sz;
    char ch;
    trie *v[26];
    trie()
    {
        int i;
        for(i=0; i<26; i++) v[i]=NULL;
        cnt=sz=0;
    }
};

void trie_insert(trie*, char*, int);
void trie_erase(trie*, char*, int);
int trie_count(trie*, char*, int);
int trie_lp(trie*, char*, int);

char s[NMAX];

int main()
{
    int tip;
    trie *root=new trie;
    while(fin>>tip)
    {
        fin>>s;
        if(tip==0) trie_insert(root, s, 0);
        else if(tip==1) trie_erase(root, s, 0);
        else if(tip==2) fout<<trie_count(root, s, 0)<<'\n';
        else fout<<trie_lp(root, s, 0)<<'\n';
    }
    return 0;
}

void trie_insert(trie* node, char *s, int lg)
{
    if(!s[lg])
    {
        node->cnt++;
        return;
    }
    if(!node->v[s[lg]-'a'])
    {
        node->v[s[lg]-'a']=new trie;
        node->sz++;
    }
    trie_insert(node->v[s[lg]-'a'], s, lg+1);
}

void trie_erase(trie* node, char *s, int lg)
{
    if(!s[lg]) node->cnt--;
    else
    {
        if(node->v[s[lg]-'a'])
        {
            trie_erase(node->v[s[lg]-'a'], s, lg+1);
            if(node->v[s[lg]-'a']->sz==0 && node->v[s[lg]-'a']->cnt==0)
            {
                delete node->v[s[lg]-'a'];
                node->v[s[lg]-'a']=NULL;
                node->sz--;
            }
        }
    }
}

int trie_count(trie *node, char *s, int lg)
{
    if(!s[lg]) return node->cnt;
    if(!node->v[s[lg]-'a']) return 0;
    return trie_count(node->v[s[lg]-'a'], s, lg+1);
}

int trie_lp(trie *node, char *s, int lg)
{
    if(!s[lg]) return lg;
    if(!node->v[s[lg]-'a']) return lg;
    return trie_lp(node->v[s[lg]-'a'], s, lg+1);
}