Pagini recente » Cod sursa (job #1379829) | Cod sursa (job #507428) | Cod sursa (job #2144192) | Cod sursa (job #1741005) | Cod sursa (job #2238600)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie{
int cnt;
Trie *alfa[30];
Trie(){
cnt = 0;
for(int i = 0; i < 26; ++i)
alfa[i] = NULL;
}
} *root;
void add(string s){
Trie *current = root;
current->cnt++;
for(int i = 0; i < int(s.size()); ++i){
int letter = s[i] - 'a';
if(current->alfa[letter] == NULL)
current->alfa[letter] = new Trie();
current = current->alfa[letter];
current->cnt++;
}
}
void rem(string s){
Trie *current = root;
current->cnt--;
for(int i = 0; i < int(s.size()); ++i){
int letter = s[i] - 'a';
current = current->alfa[letter];
current->cnt--;
}
}
int apar(string s){
Trie *current = root;
for(int i = 0; i < int(s.size()); ++i){
int letter = s[i] - 'a';
if(current->alfa[letter] == NULL)
return 0;
current = current->alfa[letter];
}
int inplus = 0;
for(int i = 0; i < 26; ++i){
if(current->alfa[i] == NULL)
continue;
inplus += current->alfa[i]->cnt;
}
int ans = current->cnt - inplus;
return ans;
}
int pref(string s){
Trie *current = root;
int len = 0;
for(int i = 0; i < int(s.size()); ++i){
int letter = s[i] - 'a';
if(current->alfa[letter] == NULL || current->alfa[letter]->cnt == 0)
return len;
len++;
current = current->alfa[letter];
}
return len;
}
int main()
{
int com;
string word;
root = new Trie();
while(fin >> com >> word){
if(com == 0) add(word);
if(com == 1) rem(word);
if(com == 2) fout << apar(word) << "\n";
if(com == 3) fout << pref(word) << "\n";
}
return 0;
}