Pagini recente » Cod sursa (job #1548654) | Cod sursa (job #2231016) | Cod sursa (job #2709143) | Cod sursa (job #3176657) | Cod sursa (job #2680539)
#include <bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct Trie{
int cnt, nr;
Trie *fiu[26];
Trie(){
cnt = nr = 0;
for(int i = 0; i < 26; i++)
fiu[i] = 0;
}
};
Trie * r;
void inserare(Trie *trie, int poz, string s){
if(poz == s.size()){
trie->nr++;
return;
}
int x = s[poz] - 'a';
if(trie->fiu[x] == NULL)
trie->fiu[x] = new Trie, trie->cnt++;
inserare(trie->fiu[x], poz + 1, s);
}
bool del(Trie *trie, int poz, string s){
if(poz == s.size())
trie->nr--;
else{
int x = s[poz] - 'a';
if(del(trie->fiu[x], poz + 1, s))
trie->fiu[x] = 0, trie->cnt--;
}
if(trie->cnt == 0 && trie->nr == 0 && trie != r)
return 1;
return 0;
}
int cautare(Trie *trie, int poz, string s){
if(poz == s.size())
return poz;
int x = s[poz] - 'a';
if(!trie->fiu[x])
return poz;
return cautare(trie->fiu[x] , poz + 1, s);
}
int cautares(Trie *trie, int poz, string s){
if(poz == s.size())
return trie->nr;
int x = s[poz] - 'a';
if(!trie->fiu[x])
return 0;
return cautares(trie->fiu[x], poz + 1, s);
}
int main(){
int caz;
string s;
r = new Trie;
while(in>>caz>>s){
if(caz == 0)
inserare(r, 0, s);
else
if(caz == 1)
del(r, 0, s);
else
if(caz == 2)
out<<cautares(r, 0, s)<<"\n";
else
out<<cautare(r, 0, s)<<"\n";
}
}