Cod sursa(job #3041397)

Utilizator BorodiBorodi Bogdan Borodi Data 31 martie 2023 13:51:06
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <fstream>
#include <vector>
#include <stack>
#include <stack>
#include <queue>
#include <algorithm>
#include <map>
#include <deque>
#include <cstring>
#define Nmax 352
using namespace std;

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

int op;
char *sir = new char[101];

struct trie{
    int howMany, NrOfWords;
    trie *son[28];

    trie(){
        howMany = NrOfWords = 0;
        fill(son, son + 27, nullptr);
    }
};

trie *T = new trie();

void Add(trie *T, char *s){
    int pos = s[0] - 'a';
    
    if(s[0] == 0)
        return;

    if(T -> son[pos] == NULL)
        T -> son[pos] = new trie();
    
    T -> son[pos] -> howMany++;

    if(strlen(s) == 1)
        T -> son[pos] -> NrOfWords++;

    Add(T -> son[pos], s + 1);
}
void Del(trie *T, char *s){
    int pos = s[0] - 'a';
    
    if(s[0] == 0)
        return;
    
    if(T -> son[pos] == NULL)
        return;

    T -> son[pos] -> howMany--;

    if(strlen(s) == 1)
        T -> son[pos] -> NrOfWords--;
    
    Del(T -> son[pos], s + 1);
}
int NrAp(trie *T, char *s){
    int pos = s[0] - 'a';
    
    if(s[0] == 0)
        return 0;
    
    if(T -> son[pos] == NULL)
        return 0;

    if(strlen(s) == 1)
        return T -> son[pos] -> NrOfWords;
    
    return NrAp(T -> son[pos], s + 1);
}
int MaxLength(trie *T, char *s, int k){
    int pos = s[0] - 'a';

    if(T -> son[pos] == NULL)
        return k;

    if(T -> son[pos] -> howMany == 0)
        return k;

    return MaxLength(T -> son[pos], s + 1, k + 1);
}
int main() {

    while(fin >> op >> sir){
        if(op == 0)
            Add(T, sir);
        else 
            if(op == 1)
                Del(T, sir);
            else if(op == 2)fout << NrAp(T, sir) << "\n";
            else fout << MaxLength(T, sir, 0) << "\n";
    }


    return 0;
}