Pagini recente » Cod sursa (job #1033759) | Cod sursa (job #1101890) | Cod sursa (job #2149316) | Cod sursa (job #2779066) | Cod sursa (job #3302560)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie{
int cnt;
struct Trie *child[26];
Trie(){
cnt = 0;
for(int i = 0; i < 26; i++){
child[i] = NULL;
}
}
} *root;
bool isempty(Trie* curr){
if(curr->cnt) return false;
for(int i = 0; i < 26; i++)
if(curr->child[i] != NULL) return false;
return true;
}
Trie* getout(Trie* curr, string s, int depth = 0){
if(depth == s.size()){
curr->cnt--;
if(isempty(curr)){
delete(curr);
curr = NULL;
}
return curr;
}
curr->child[s[depth] - 'a'] = getout(curr->child[s[depth] - 'a'], s, depth + 1);
if(isempty(curr) && curr != root){ //nu vreau sa sterg root
delete(curr);
curr = NULL;
}
return curr;
}
signed main()
{
root = new Trie();
int c;
while(fin >> c){
string s;
fin >> s;
if(c == 0){
Trie *curr = root;
for(int i = 0; i < s.size(); i++){
if(curr->child[s[i] - 'a'] == NULL)
curr->child[s[i] - 'a'] = new Trie();
curr = curr->child[s[i] - 'a'];
}
curr->cnt++;
}
else if(c == 2){
Trie *curr = root;
int found = 0;
for(int i = 0; i < s.size(); i++){
if(curr->child[s[i] - 'a'] == NULL)
break;
if(i == s.size() - 1) found = 1;
curr = curr->child[s[i] - 'a'];
}
if(found == 0)
fout << 0 << '\n';
else
fout << curr->cnt << '\n';
}
else if(c == 3){
int i = 0;
Trie *curr = root;
for(i = 0; i < s.size(); i++){
if(curr->child[s[i] - 'a'] == NULL)
break;
curr = curr->child[s[i] - 'a'];
}
fout << i << '\n';
}
else
getout(root, s);
}
return 0;
}