Pagini recente » Cod sursa (job #2145459) | Cod sursa (job #2171427) | Cod sursa (job #2958324) | Cod sursa (job #1390252) | Cod sursa (job #2405719)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
const int Dim = 1000001;
int n,nrmi;
char T[Dim];
struct Trie{
Trie *Next[27];
int nrcuv,nrpfr;
Trie() {
for ( int i = 0; i < 30; ++i)
Next[i] = nullptr;
nrcuv = nrpfr = 0;
};
} *t = new Trie();
void Add(char T[Dim]) {
int n = strlen(T + 1);
Trie *aux = t;
for ( int i = 1; i <= n; ++i) {
if( aux->Next[T[i] - 'a' ] == nullptr) {
aux->Next[T[i] -'a'] = new Trie();
}
aux = aux->Next[T[i] - 'a'];
aux->nrpfr++;
if ( i == n)
aux->nrcuv++;
}
}
void Erase(char T[Dim]) {
int n = strlen(T+1);
Trie *aux = t;
for ( int i = 1; i <= n; ++i) {
aux = aux->Next[T[i] - 'a'];
if ( aux == nullptr)
return;
aux->nrpfr--;
if ( i == n)
aux->nrcuv--;
}
}
int Query2(char T[Dim]) {
int n = strlen(T+1);
Trie *aux = t;
for ( int i = 1; i <= n; ++i) {
aux = aux->Next[T[i] - 'a'];
if ( aux == nullptr)
return 0;
if ( i == n)
return aux->nrcuv;
}
}
int Query3(char T[Dim]) {
int n = strlen(T + 1);
Trie *aux = t;
int lung = 0;
for ( int i = 1; i <= n; ++i) {
aux = aux->Next[T[i] - 'a'];
if ( aux == nullptr)
return lung;
if (aux->nrpfr > nrmi)
++lung;
}
return lung;
}
int main() {
int x;
while ( fin >> x ) {
memset(T,0,sizeof(0));
fin >> (T + 1);
if ( x == 0) {
Add(T);
}
else if ( x == 1) {
Erase(T);
}
else if ( x == 2) {
fout << Query2(T) << "\n";
}
else {
nrmi = 0;
fout << Query3(T) << "\n";
}
}
}