Pagini recente » Cod sursa (job #1591989) | Cod sursa (job #3249495) | Cod sursa (job #2397753) | Cod sursa (job #1907063) | Cod sursa (job #2515385)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int cer;
char a[25];
int n;
struct trie{
int nrcnt;
int fin;
trie *urm[30];
trie(){
nrcnt = 0;
fin = 0;
memset(urm, NULL, sizeof(urm));
}
};
trie *p = new trie();
void adaug(trie *&q, int poz){
if(poz == n) {
q->fin ++;
return;
}
if(!q->urm[a[poz]-'a']){
trie *nou = new trie();
//nou->adancime = poz+1;
//q->nrfii++;
q->urm[a[poz]-'a'] = nou;
}
q->urm[a[poz]-'a']->nrcnt++;
adaug(q->urm[a[poz]-'a'], poz+1);
}
void sterg(trie *&q, int poz){
if(poz == n){
q->fin--;
return;
}
q->urm[a[poz]-'a']->nrcnt--;
sterg(q->urm[a[poz]-'a'], poz+1);
}
int nraparitii(trie *q, int poz){
if(poz == n){
return q->fin;
}
if(q->urm[a[poz]-'a'])
return nraparitii(q->urm[a[poz]-'a'], poz+1);
return 0;
}
int prefix(trie *q, int poz, int k){
if(poz == n)
return n;
if(!q->urm[a[poz]-'a'] || q->urm[a[poz]-'a']->nrcnt==0)
return k;
return prefix(q->urm[a[poz]-'a'], poz+1, k+1);
}
int main()
{
int i=1;
while(f>>cer>>a){
n=strlen(a);
if(cer == 0){
adaug(p, 0);
}
else if(cer == 1){
sterg(p, 0);
}
else if(cer == 2){
if(!p->urm[a[0]-'a'])
g<<"0"<<'\n';
else g<<nraparitii(p, 0)<<'\n';
}
else g<<prefix(p, 0, 0)<<'\n';
i++;
}
return 0;
}