Pagini recente » Cod sursa (job #1736747) | Cod sursa (job #1142246) | Cod sursa (job #1791040) | Cod sursa (job #2102022) | Cod sursa (job #2266614)
#include <bits/stdc++.h>
using namespace std;
string s;
ifstream fi("trie.in");
ofstream fo("trie.out");
struct trie{
int nr, nrf;
trie *fiu[26];
trie(){
nr = nrf = 0;
memset(fiu, 0, sizeof(fiu));
}
};
trie *T = new trie;
void ins(trie *nod, string::iterator it){
if(it != s.end()){
if(nod->fiu[*it] == 0){
nod->nrf++;
nod->fiu[*it] = new trie;
}
ins(nod->fiu[*it], it + 1);
}
else
nod->nr++;
}
int del(trie *nod, string::iterator it){//0 - inca taiem. 1 - nu mai taiem
if(it == s.end()){
nod->nr--;
if(nod->nr == 0 && nod->nrf == 0)
return 0;
return 1;
}
int aux = del(nod->fiu[*it], it + 1);
if(aux == 0){
delete nod->fiu[*it];
nod->nrf--;
nod->fiu[*it] = 0;
if(nod->nr == 0 && nod->nrf == 0)
return 0;
}
return 1;
}
int get_occ(trie *nod, string::iterator it){
if(it != s.end()){
if(nod->fiu[*it] == 0)
return 0;
return get_occ(nod->fiu[*it], it + 1);
}
return nod->nr;
}
int get_pref(trie *nod, string::iterator it, int niv){
if(it != s.end()){
if(nod->fiu[*it] == 0)
return niv;
return get_pref(nod->fiu[*it], it + 1, niv + 1);
}
return niv;
}
int main()
{
int op;
fi >> op >> s;
while(!fi.eof()){
for(int i = 0; i < s.size(); i++)
s[i] -= 'a';
if(op == 0)
ins(T, s.begin());
else if(op == 1)
del(T, s.begin());
else if(op == 2)
fo << get_occ(T, s.begin()) << '\n';
else
fo << get_pref(T, s.begin(), 0) << '\n';
fi >> op >> s;
}
fi.close();
fo.close();
return 0;
}