Pagini recente » Cod sursa (job #3142817) | Cod sursa (job #3147896) | Cod sursa (job #2594281) | Cod sursa (job #3233646) | Cod sursa (job #3278316)
#include <bits/stdc++.h>
std::ifstream fin("trie.in");
std::ofstream fout("trie.out");
const int SIZE = 1e2; // dimensiunea maxima a unui cuvant
const int ALPHABET_SIZE = 26; // dimensiunea alfabetului folosit, aici avem 26 ('a'..'z'), putem avea 2 daca avem numai 1 si 0
std::pair<int, int> trie[SIZE][ALPHABET_SIZE]; // matricea prin care vom reprezenta tria (merge si cu pointeri, insa este mai lenta)
int isEnd[SIZE]; // sfarsitul unui cuvant
int nodes = 1; // numarul de noduri, de asemenea node 0 este radacina (root)
int frecv[SIZE];
//
// Inserarea in trie - iterativ
//
void Insert(std::string text)
{
int node = 0;
for(char ch : text)
{
int idx = ch - 'a';
if(!trie[node][idx].first)
trie[node][idx].first = nodes++;
node = trie[node][idx].first;
frecv[node]++;
}
isEnd[node]++;
trie[node][text.back() - 'a'].second++;
}
//
// Cautarea in trie - iterativ
//
int Search(std::string text)
{
int node = 0;
for(char ch : text)
{
int idx = ch - 'a';
if(!trie[node][idx].first)
return false;
node = trie[node][idx].first;
}
return isEnd[node]; // sau trie[node][text.back() - 'a'].second;
}
//
// Stergerea in trie - recursiv (iterativ - greu de implementat si mai putin intuitiv ig)
//
void Delete(std::string text)
{
int node = 0;
for(char ch : text)
{
int idx = ch - 'a';
if(!trie[node][idx].first)
return;
node = trie[node][idx].first;
}
if(isEnd[node])
{
isEnd[node]--;
trie[node][text.back() - 'a'].second--;
node = 0;
for(char ch : text)
{
int idx = ch - 'a';
node = trie[node][idx].first;
frecv[node]--;
}
}
}
//
// Cel mai lung prefix comun al lui TXT cu oricare alt cuvant
//
int LongestPrefix(std::string text)
{
int node = 0;
int len = 0;
for(char ch : text)
{
int idx = ch - 'a';
if(!trie[node][idx].first)
break;
node = trie[node][idx].first;
if(frecv[node])
len++;
else
break;
}
return len;
}
int main()
{
std::ios_base::sync_with_stdio(false);
fin.tie(nullptr);
while(!fin.eof())
{
int op;
std::string word;
fin >> op >> word;
switch(op)
{
case 0:
Insert(word);
break;
case 1:
Delete(word);
break;
case 2:
fout << Search(word) << "\n";
break;
case 3:
fout << LongestPrefix(word) << "\n";
break;
}
}
return 0;
}