Pagini recente » Cod sursa (job #1066285) | Cod sursa (job #1214118) | Cod sursa (job #543565) | Cod sursa (job #298937) | Cod sursa (job #2705615)
#include <bits/stdc++.h>
#define T 26
using namespace std;
#define input f
#define output g
#define NMAX 10005
ifstream f("trie.in");
ofstream g("trie.out");
struct Nod {
int next[T];
int index = 0;
int contains = 0;
Nod(int idx = 0) {
index = idx;
fill(begin(next), end(next), -1);
}
};
vector<Nod> trie(1);
void insert(string s) {
int v = 0;
for (int i = 0; i < s.size(); i++) {
if (trie[v].next[s[i] - 'a'] == -1) {
trie[v].next[s[i] - 'a'] = trie.size();
trie.emplace_back(Nod());
}
v = trie[v].next[s[i] - 'a'];
trie[v].contains ++;
}
trie[v].index++;
}
void remove(string s) {
int v = 0;
for (int i = 0; i < s.size(); i++) {
v = trie[v].next[s[i] - 'a'];
trie[v].contains --;
}
trie[v].index--;
}
int aparitii(string s) {
int v = 0;
for (int i = 0; i < s.size() && v != -1; i++) {
v = trie[v].next[s[i] - 'a'];
}
return v == -1 ? 0 : trie[v].index;
}
int prefix(string s) {
int v = 0;
for (int i = 0; i < s.size(); i++) {
if(trie[trie[v].next[s[i]-'a']].contains == 0)
return i;
v = trie[v].next[s[i] - 'a'];
}
return s.size();
}
int main() {
int op;
string s;
while (input >> op >> s) {
if (op == 0) {
insert(s);
} else if (op == 1) {
remove(s);
} else if (op == 2) {
output << aparitii(s) << '\n';
} else { //3
output << prefix(s) << '\n';
}
}
}