Pagini recente » Cod sursa (job #1960803) | Cod sursa (job #690021) | Cod sursa (job #2345285) | Cod sursa (job #3267982) | Cod sursa (job #2654861)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
Trie *fii[30];
int nrcuv;
int nrpref;
Trie()
{
for (int i=0;i<=26;i++)
{
fii[i]=nullptr;
nrcuv=0;
nrpref=0;
}
};
};
Trie *rad = new Trie();
void Add(char T[5000]) {
int n = strlen(T);
Trie *aux = rad;
for ( int i = 0; i < n; ++i) {
if(aux->fii[T[i]-'a'] == nullptr) {
aux->fii[T[i]-'a'] = new Trie();
}
aux = aux->fii[T[i]-'a'];
aux->nrpref ++;
if(i == n-1)
aux->nrcuv++;
}
}
void Erase(char T[5000]) {
int n = strlen(T);
Trie*aux = rad;
for ( int i = 0; i < n; ++i) {
aux = aux->fii[T[i]-'a'];
if(aux == nullptr)
return;
aux->nrpref--;
if( i == n-1)
aux->nrcuv--;
}
}
int Query1(char T[5000]) {
int n =strlen(T);
Trie *aux = rad;
for ( int i = 0; i < n; ++i) {
aux = aux->fii[T[i]-'a'];
if(aux == nullptr)
return 0;
if(i == n-1)
return aux -> nrcuv;
}
}
int Query2(char T[5000]) {
int n = strlen(T);
Trie *aux = rad;
int lung = 0;
for ( int i = 0 ; i < n; ++i) {
aux = aux->fii[T[i]-'a'];
if(aux == nullptr)
return lung;
if (aux->nrpref>0)
++lung;
}
return lung;
}
char t[5000];
int main() {
int x;
while(fin >> x) {
fin >> t;
if(x == 0)
Add(t);
if(x == 1)
Erase(t);
if(x == 2)
fout << Query1(t) << "\n";
if(x == 3)
fout << Query2(t)<<"\n";
}
}