Pagini recente » Cod sursa (job #2071699) | Cod sursa (job #2792597) | Cod sursa (job #2445363) | Cod sursa (job #1800847) | Cod sursa (job #1627196)
#include <iostream>
#include <vector>
#include <fstream>
#include <cmath>
#include <string>
#define maxN 100000 + 5
using namespace std;
struct Trie{
int wor, pref;
Trie *V[26];
Trie(){
wor = pref = 0;
for (int i = 0; i < 26; ++i)
V[i] = 0;
}
}*R;
void insert(string w){
Trie *p = R;
for (int i = 0; i < w.size(); ++i){
int y = w[i] - 'a';
if (p->V[y] == 0){
Trie *T = new Trie;
p->V[y] = T;
}
p = p->V[y];
p->pref++;
if (i == w.size() - 1)
p->wor++;
}
}
void sterge(Trie *p){
for (int i = 0; i < 26; ++i){
if (p->V[i] != 0)
sterge(p->V[i]);
}
delete(p);
}
void del(string w){
Trie *q, *p = R;
for (int i = 0; i < w.size(); ++i){
int y = w[i] - 'a';
q = p->V[y];
if (p->V[y] == 0)
return;
q->pref--;
if (i == w.size()-1)
q->wor--;
if (q->pref == 0){
p->V[y] = 0;
sterge(q);
return;
}
else
p = q;
}
}
int num(string w){
Trie *p = R;
int s = 0;
for (int i = 0; i < w.size(); ++i){
int y = w[i] - 'a';
if (p->V[y] == 0)
return 0;
p = p->V[y];
s = p->wor;
}
return s;
}
int lung(string w){
Trie *p = R;
int s = 0;
for (int i = 0; i < w.size(); ++i){
int y = w[i] - 'a';
if (p->V[y] == 0)
return s;
p = p->V[y];
s++;
}
return s;
}
int main()
{
ifstream f("trie.in");
ofstream g("trie.out");
int x;
R = new Trie;
while (f >> x){
string w;
f >> w;
if (x == 0)
insert(w);
if (x == 1)
del(w);
if (x == 2)
g << num(w)<<'\n';
if (x == 3)
g << lung(w)<<'\n';
}
f.close();
g.close();
return 0;
}