Cod sursa(job #3258772)

Utilizator nicushor21Pirlog Marian Nicolae nicushor21 Data 23 noiembrie 2024 15:57:54
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.12 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie{
    char litera;
    int cuv;
    vector <trie*> v;

    trie(char lit){
        litera = lit;
        cuv = 0;
    }
};
void ins(trie *root, char *cuv){
    if(cuv[0]){
        bool ok = 0;
        for(auto &elem:root->v){
            if(elem->litera == cuv[0]){
                ok=1;
                ins(elem, cuv+1);
                break;
            }
        }
        if(!ok){
            root->v.push_back(new trie(cuv[0]));
            ins(root->v.back(), cuv+1);
        }
    }else{
        root->cuv++;
    }
}
void rem(trie *root, char *cuv){
    if(cuv[0]){
        for(int i=root->v.size()-1; i>=0; i--){
            if(root->v[i]->litera == cuv[0]){
                rem(root->v[i], cuv+1);
                if(root->v[i]->cuv == 0 && root->v[i]->v.size() == 0){
                    delete root->v[i];
                    root->v.erase(root->v.begin()+i);
                }
                break;
            }
        }
    }else{
        root->cuv--;
    }
}
int apar(trie *root, char *cuv){
    if(cuv[0]){
        for(auto &elem:root->v){
            if(elem->litera == cuv[0]){
                return apar(elem, cuv+1);
            }
        }
        return 0;
    }else{
        return root->cuv;
    }
}
int lpc(trie *root, char *cuv){
    if(cuv[0]){
        for(auto &elem:root->v){
            if(elem->litera == cuv[0]){
                return lpc(elem, cuv+1)+1;
            }
        }
        return 0;
    }else{
        return 0;
    }
}
void show(trie *root){
    fout<<root->litera<<':'<<root->cuv<<'\n';
    for(auto &elem:root->v)
        show(elem);
}
char cuv[25];
int c,i;
trie *root = new trie('$');
int main()
{
    while(fin>>c){
        fin>>cuv;
        if(c == 0){
            ins(root, cuv);
        }else if(c == 1){
            rem(root, cuv);
        }else if(c == 2){
            fout<<apar(root,cuv)<<'\n';
        }else{
            fout<<lpc(root,cuv)<<'\n';
        }
    }
    //show(root);
    return 0;
}