Pagini recente » Cod sursa (job #1455558) | Cod sursa (job #796360) | Cod sursa (job #1851720) | Cod sursa (job #2716409) | Cod sursa (job #1360721)
#include<cstdio>
#include<string>
#include<cstring>
#include<stack>
using namespace std;
#ifdef HOME
const string inputFile = "input.txt";
const string outputFile = "output.txt";
#else
const string problemName = "trie";
const string inputFile = problemName + ".in";
const string outputFile = problemName + ".out";
#endif
struct node {
node *f[26];
int pass, end;
node() {
pass = end = 0;
memset(f, 0, sizeof(f));
}
};
node *root;
void insert(char w[]) {
int N = strlen(w), i, c;
node *Q = root;
for(i = 0; i < N; i++) {
c = w[i] - 'a';
if(!Q->f[c])
Q->f[c] = new node;
Q = Q->f[c];
Q->pass++;
}
Q->end++;
}
void erase(char w[]) {
int N = strlen(w), i, c;
node *Q = root;
node *P[30], *R;
P[0] = root;
for(i = 0; i < N; i++) {
c = w[i] - 'a';
Q = Q->f[c];
Q->pass--;
P[i + 1] = Q;
}
Q->end--;
for(i = N; i >= 1; i--) {
Q = P[i];
R = P[i - 1];
if(!Q->pass) {
c = w[i - 1] - 'a';
R->f[c] = 0;
delete Q;
} else
break;
}
}
int count(char w[]) {
int N = strlen(w), i, c;
node *Q = root;
for(i = 0; i < N; i++) {
c = w[i] - 'a';
if(!Q->f[c])
return 0;
Q = Q->f[c];
}
return Q->end;
}
int prefix(char w[]) {
int N = strlen(w), i, c;
node *Q = root;
for(i = 0; i < N; i++) {
c = w[i] - 'a';
if(!Q->f[c])
return i;
Q = Q->f[c];
}
return i;
}
int main() {
int t;
char w[30];
freopen(inputFile.c_str(), "r", stdin);
freopen(outputFile.c_str(), "w", stdout);
root = new node;
while(scanf("%d %s\n", &t, w) + 1) {
if(t == 0) {
insert(w);
continue;
}
if(t == 1) {
erase(w);
continue;
}
if(t == 2) {
printf("%d\n", count(w));
continue;
}
if(t == 3) {
printf("%d\n", prefix(w));
continue;
}
}
return 0;
}