Pagini recente » Cod sursa (job #2599719) | Cod sursa (job #2114506) | Cod sursa (job #2357000) | Cod sursa (job #1691781) | Cod sursa (job #3290873)
#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;
}