Pagini recente » Cod sursa (job #3346941) | Cod sursa (job #22829) | Cod sursa (job #1294081) | Cod sursa (job #3325932) | Cod sursa (job #3332070)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie {
int cnt, ap;
Trie *child[26];
Trie() {
cnt = ap = 0;
memset(child, 0, sizeof(child));
}
};
int type;
string c;
Trie *T;
void ins(string s)
{
Trie *x = T;
for (int i=0;i<s.size();i++){
int newn = s[i] - 'a';
if (!x->child[newn])
x->child[newn] = new Trie;
x = x->child[newn];
x->ap ++;
}
x->cnt ++;
}
void del(string s)
{
Trie *x = T;
for (int i=0;i<s.size();i++){
int newn = s[i] - 'a';
x = x->child[newn];
x->ap --;
}
x->cnt --;
}
int appear(string s)
{
Trie *x = T;
for (int i=0;i<s.size();i++){
int newn = s[i] - 'a';
if (x->child[newn] && x->child[newn]->ap)
x = x->child[newn];
else
return 0;
}
return x->cnt;
}
int pref(string s)
{
Trie *x = T;
int lg = 0;
for (int i=0;i<s.size();i++){
int newn = s[i] - 'a';
if (x->child[newn] && x->child[newn]->ap)
x = x->child[newn];
else
return lg;
lg ++;
}
return lg;
}
int main()
{
T = new Trie;
while(fin >> type >> c) {
if (type == 0) {
ins(c);
}else if (type == 1){
del(c);
}else if (type == 2){
fout << appear(c) << '\n';
}else{
fout << pref(c) << '\n';
}
}
return 0;
}