Pagini recente » Cod sursa (job #244761) | Cod sursa (job #891283) | Cod sursa (job #846274) | Borderou de evaluare (job #2830518) | Cod sursa (job #2515367)
#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 nrfii;
trie *urm[30];
trie(){
nrcnt = 0;
nrfii = 0;
memset(urm, NULL, sizeof(urm));
}
};
trie *p = new trie();
void adaug(trie *&q, int poz){
if(poz == n)
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)
return;
q->urm[a[poz]-'a']->nrcnt--;
if(q->urm[a[poz]-'a']->nrcnt == 0)
q->nrfii--;
sterg(q->urm[a[poz]-'a'], poz+1);
}
int nraparitii(trie *q, int poz){
if(poz == n-1){
if(q->urm[a[poz]-'a']->nrfii == 0)
return q->urm[a[poz]-'a']->nrcnt;
return 0;
}
return nraparitii(q->urm[a[poz]-'a'], poz+1);
}
int prefix(trie *q, int poz, int k){
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()
{
while(f>>cer>>a){
n=strlen(a);
if(cer == 0){
adaug(p, 0);
}
else if(cer == 1){
sterg(p, 0);
}
else if(cer == 2){
g<<nraparitii(p, 0)<<'\n';
}
else g<<prefix(p, 0, 0)<<'\n';
}
return 0;
}