Cod sursa(job #3290873)

Utilizator mihai_bosIancu Mihai mihai_bos Data 1 aprilie 2025 17:04:12
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include <fstream>
#include <string>
#include <cstring>
using namespace std;

const int ALPHABET_SIZE = 26;
const int MAX_NODES = 3000000;

int trie[MAX_NODES][ALPHABET_SIZE]; // trie[node][litera] = indicele nodului copil (0 dacă nu există)
int cnt[MAX_NODES];                 // cnt[node] = numărul de cuvinte care trec prin acest nod
int nodeCount = 1;                  // index 0 este rădăcina

// Inserare în trie (actualizează și contorul pentru prefixe)
void insert(const string &s) {
    int node = 0;
    for (char c : s) {
        int idx = c - 'a';         // calculează indexul pentru litera curentă
        if (trie[node][idx] == 0) {  // dacă nu există legătură pentru litera respectivă
            trie[node][idx] = nodeCount++; // creează nodul nou
        }
        node = trie[node][idx];    // trece la nodul copil
        cnt[node]++;               // actualizează contorul pentru prefixe
    }
}

// Funcție pentru interogare: întoarce numărul de cuvinte care au 's' ca prefix
int query(const string &s) {
    int node = 0;
    for (char c : s) {
        int idx = c - 'a';
        if (trie[node][idx] == 0)  // dacă nu există legătură, niciun cuvânt nu are acest prefix
            return 0;
        node = trie[node][idx];
    }
    return cnt[node];
}

int main() {
    // Deschidem fișierele de intrare și ieșire
    ifstream fin("trie.in");
    ofstream fout("trie.out");

    int n, m;
    fin >> n >> m;
    string s;

    // Inserăm cele n cuvinte în trie
    for (int i = 0; i < n; i++) {
        fin >> s;
        insert(s);
    }

    // Pentru fiecare dintre cele m interogări, scriem în fișierul de ieșire rezultatul
    for (int i = 0; i < m; i++) {
        fin >> s;
        fout << query(s) << "\n";
    }

    // Închidem fișierele
    fin.close();
    fout.close();
    return 0;
}