Pagini recente » Cod sursa (job #1589661) | Istoria paginii utilizator/murarugeorge | Borderou de evaluare (job #3154600) | Borderou de evaluare (job #2838279) | Cod sursa (job #810336)
Cod sursa(job #810336)
#include <set>
#include <string>
#include <cstdio>
#include <algorithm>
using namespace std;
struct node {
int end, suf;
node * A[26];
}* trie;
int n;
char str[128];
int main() {
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
trie = new node();
trie->suf = 0;
trie->end = 0;
while (scanf("%d %s", &n, str) == 2) {
string s(str);
if (n == 0) {
node * current = trie;
for (size_t i = 0; i < s.size(); i++) {
int c = s[i] - 'a';
if (current->A[c] == 0) {
current->A[c] = new node();
}
current = current->A[c];
current->suf++;
}
current->end++;
}
if (n == 1) {
node * current = trie;
for (size_t i = 0; i < s.size(); i++) {
int c = s[i] - 'a';
current = current->A[c];
current->suf--;
}
current->end--;
}
if (n == 2) {
node * current = trie;
for (size_t i = 0; i < s.size(); i++) {
int c = s[i] - 'a';
if (current->A[c] == 0) {
current->A[c] = new node();
}
current = current->A[c];
}
printf("%d\n", current->end);
}
if (n == 3) {
node * current = trie;
int lcp = 0;
for (size_t i = 0; i < s.size(); i++) {
int c = s[i] - 'a';
if (current->A[c] == 0 || current->A[c]->suf == 0) {
break;
}
lcp++;
current = current->A[c];
}
printf("%d\n", lcp);
}
}
return 0;
}