Cod sursa(job #2630256)

Utilizator StasBrega Stanislav Stas Data 24 iunie 2020 21:00:17
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

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

struct Trie
{
    int fin,nr;
    Trie *fiu[26];
    Trie()
    {
        fin = nr = 0;
        memset(fiu,0,sizeof(fiu));
    }
};
Trie *T = new Trie;
void ins(Trie *node, char s[25], int k)
{
    if(k==strlen(s))
    {
        node->fin++;
        return;
    }
    if(!node->fiu[s[k]-'a'])
        node->fiu[s[k]-'a']=new Trie,
        node->nr++;
    ins(node->fiu[s[k]-'a'], s, k+1);
}
int del(Trie *node, char s[25], int k)
{
    if(k==strlen(s))
        node->fin--;
    else if(del(node->fiu[s[k]-'a'],s,k+1))
    {
        node->fiu[s[k]-'a']=0;
        node->nr--;
    }
    if(!node->fin and !node->nr and node!=T)
    {
        delete node;
        return 1;
    }
    return 0;
}
int findt(Trie *node, char s[25], int k)
{
    if(k==strlen(s))
        return node->fin;
    if(node->fiu[s[k]-'a'])
        return findt(node->fiu[s[k]-'a'],s,k+1);
    return 0;
}
int pref(Trie *node, char s[25], int k)
{
    if(k==strlen(s) or !node->fiu[s[k]-'a'])
        return k;
    return pref(node->fiu[s[k]-'a'],s,k+1);
}
int main()
{

    int t;
    char w[25];

    while(fin >> t >> w)
    {
        if(t==0) ins(T, w, 0);
        else if(t==1) del(T, w, 0);
        else if(t==2) fout << findt(T, w, 0) << "\n";
        else if(t==3) fout << pref(T, w, 0) << "\n";
    }

    return 0;

}