Pagini recente » Cod sursa (job #2546322) | Cod sursa (job #2070338) | Cod sursa (job #747077) | Cod sursa (job #3180755) | Cod sursa (job #1220572)
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <fstream>
#include <map>
using namespace std;
#define MAX 1000001
ifstream f("trie.in");
ofstream g("trie.out");
struct Nod{
int x; // nr de match-uri
int y; // nr de cuvinte complete
struct Nod * f[26]; // fii
Nod() {
x = 0;
y = 0;
memset(f, 0, sizeof(f));
}
};
struct Trie{
Nod * varf;
Trie() {
varf = new Nod();
}
void add(string c) {
Nod * it = varf;
int u;
for (int i = 0; i < c.length(); i++) {
u = c[i]-'a';
if (it->f[u] == 0) {
it->f[u] = new Nod();
}
it = it->f[u];
it->x++;
}
it->y++;
}
void rem(string c) {
Nod * it = varf;
int u;
for (int i = 0; i < c.length(); i++) {
u = c[i]-'a';
it = it->f[u];
it->x--;
}
it->y--;
}
int app(string c) {
Nod * it = varf;
int u;
for (int i = 0; i < c.length(); i++) {
u = c[i]-'a';
if (it->f[u] == 0) {
return 0;
}
it = it->f[u];
}
return it->y;
}
int pre(string c) {
Nod * it = varf;
int u, l = 0;
for (int i = 0; i < c.length(); i++) {
u = c[i]-'a';
if (it->f[u] == 0 || it->f[u]->x == 0) return l;
it = it->f[u];
l++;
}
return l;
}
} T;
int main() {
int op;
string c;
//freopen("inversmodular.out","w",stdout);
while (!f.eof()){
c = "";
f >> op >> c;
if (c == "") break;
switch(op) {
case 0:
T.add(c);
break;
case 1:
T.rem(c);
break;
case 2:
g << T.app(c) << "\n";
break;
case 3:
g << T.pre(c) << "\n";
break;
}
}
return 0;
}