Pagini recente » Cod sursa (job #775966) | Cod sursa (job #2614944) | Cod sursa (job #1599533) | Cod sursa (job #930171) | Cod sursa (job #2439139)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Trie{
int nr,nrfii;
Trie *fiu[26];
Trie(){
nr = nrfii = 0;
memset( fiu, 0, sizeof( fiu ) );
}
};
Trie *T = new Trie;
string s;
int n;
void ins(Trie *node, int p){
if(p == n)
node -> nr++;
else{
if(node -> fiu[s[p] - 'a'] == 0){
node -> nrfii++;
node -> fiu[s[p] - 'a'] = new Trie;
}
ins(node -> fiu[s[p] - 'a'], p + 1);
}
}
bool del(Trie *node, int p){
if(p == n)
node -> nr--;
else
if(del(node -> fiu[s[p] - 'a'], p + 1)){
node -> fiu[s[p] - 'a'] = 0;
node -> nrfii--;
}
if(node != T && node -> nrfii == 0 && node -> nr == 0){
delete node;
return 1;
}
return 0;
}
int see(Trie *node, int p){
if(p == n)
return node -> nr;
if(node -> fiu[s[p] - 'a'] == 0)
return 0;
return see(node -> fiu[s[p] - 'a'], p + 1);
}
int prefix(Trie *node, int p){
if(p == n || node -> fiu[s[p] - 'a'] == 0)
return p;
return prefix(node -> fiu[s[p] - 'a'], p + 1);
}
int main(){
int type;
while(f >> type >> s){
n = s.size();
switch(type){
case 0:{
ins(T, 0);
break;
}
case 1:{
del(T, 0);
break;
}
case 2:{
g << see(T, 0) << "\n";
break;
}
case 3:{
g << prefix(T,0) << "\n";
break;
}
}
}
return 0;
}