Cod sursa(job #3262050)

Utilizator adimiclaus15Miclaus Adrian Stefan adimiclaus15 Data 8 decembrie 2024 14:37:39
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <bits/stdc++.h>

using namespace std;

struct Trie {
    int cnt;
    Trie* next[26];
    Trie() {
        cnt = 0;
        for(int i = 0; i < 26; i++) {
            next[i] = NULL;
        }
    }
};

Trie *root;

void adaugare(string &s) {
    Trie* p = root;
    for(int i = 0; i < (int)s.size(); i++) {
        int pos = s[i] - 'a';
        if(p -> next[pos] == NULL) {
            p -> next[pos] = new Trie();
        }
        p = p -> next[pos];
        p -> cnt++;
    }
}

int longestPrefix(string &s) {
    Trie* p = root;
    for(int i = 0; i < (int)s.size(); i++) {
        int pos = s[i] - 'a';
        if(p -> next[pos] == NULL || p -> next[pos] -> cnt == 0) {
            return i;
        }
        p = p -> next[pos];
        //p -> cnt++;
    }
    return s.size();
}

void stergere(string &s) {
    Trie* p = root;
    for(int i = 0; i < (int)s.size(); i++) {
        int pos = s[i] - 'a';
        // if(p -> next[pos] == NULL) {
        //     p -> next[pos] = new Trie();
        // }
        p = p -> next[pos];
        p -> cnt--;
    }
}

int nrAparitii(string &s) {
    Trie* p = root;
    for(int i = 0; i < (int)s.size(); i++) {
        int pos = s[i] - 'a';
        if(p -> next[pos] == NULL) {
            return 0;
        }
        p = p -> next[pos];
        //p -> cnt++;
    }
    int sum = 0;
    for(int i = 0; i < 26; i++) {
        if(p -> next[i] != NULL) {
            sum += p -> next[i] -> cnt;
        }
    }
    return p -> cnt - sum;
}

int main() {
    ifstream f("trie.in");
    ofstream g("trie.out");
    root = new Trie();
    int op;
    string s;
    while(f >> op >> s) {
        if(op == 0) {
            adaugare(s);
        }
        if(op == 1) {
            stergere(s);
        }
        if(op == 2) {
            g << nrAparitii(s) << '\n';
        }
        if(op == 3) {
            g << longestPrefix(s) << '\n';
        }
    }
    return 0;
}