Pagini recente » Cod sursa (job #493992) | Cod sursa (job #2915287) | Cod sursa (job #1157336) | Cod sursa (job #2919144) | Cod sursa (job #2371558)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <utility>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <queue>
#include <map>
#include <stack>
#define ll long long
#define lsb(x) (x & -x)
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct Trie {
int cnt, pref;
Trie* son[27];
Trie() {
cnt = pref = 0;
memset(son, NULL, sizeof(son));
}
};
Trie* root;
void add(Trie* node, int pos, const string &s) {
node -> pref ++;
if(pos == s.size())
node -> cnt ++;
else {
char c = s[pos] - 'a';
if(node -> son[c] == NULL)
node -> son[c] = new Trie();
add(node -> son[c], pos + 1, s);
}
}
void del(Trie* node, int pos, const string &s) {
node -> pref --;
if(pos == s.size())
node -> cnt --;
else {
char c = s[pos] - 'a';
del(node -> son[c], pos + 1, s);
}
}
int query2(Trie* node, int pos, const string &s) {
if(pos == s.size())
return node -> cnt;
char c = s[pos] - 'a';
if(node -> son[c] == NULL)
return 0;
return query2(node -> son[c], pos + 1, s);
}
int query3(Trie* node, int pos, const string &s) {
if(pos == s.size())
return pos;
char c = s[pos] - 'a';
if(node -> son[c] == NULL)
return pos;
if(node -> son[c] -> pref == 0)
return pos;
return query3(node -> son[c], pos + 1, s);
}
int main() {
root = new Trie();
int type;
string s;
while(in >> type >> s) {
if(type == 0)
add(root, 0, s);
if(type == 1)
del(root, 0, s);
if(type == 2)
out << query2(root, 0, s) << "\n";
if(type == 3)
out << query3(root, 0, s) << "\n";
}
return 0;
}