Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #809664) | Cod sursa (job #172289) | Cod sursa (job #2553567)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie{
int nrcnt;
int fin;
trie *urm[30];
trie(){
nrcnt=0;
fin=0;
memset(urm, NULL, sizeof(urm));
}
};
trie *p = new trie();
int cer, n;
char a[25];
void adaug(trie *&p, int poz){
if(poz == n){
p->fin++;
return;
}
if(!p->urm[a[poz]-'a']){
p->urm[a[poz]-'a'] = new trie();
}
p->urm[a[poz]-'a']->nrcnt++;
adaug(p->urm[a[poz]-'a'], poz+1);
}
void sterg(trie *&p, int poz){
if(poz == n){
p->fin--;
return;
}
p->urm[a[poz]-'a']->nrcnt--;
sterg(p->urm[a[poz]-'a'], poz+1);
}
int nraparitii(trie *p, int poz){
if(poz == n)
return p->fin;
if(p->urm[a[poz]-'a'])
return nraparitii(p->urm[a[poz]-'a'], poz+1);
return 0;
}
int prefix(trie *p, int poz, int k){
if(poz==n)
return n;
if(!p->urm[a[poz]-'a'] || p->urm[a[poz]-'a']->nrcnt == 0)
return k;
return prefix(p->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){
if(!p->urm[a[0]-'a'])
g<<"0"<<'\n';
else g<<nraparitii(p, 0)<<'\n';
}
else{
g<<prefix(p, 0, 0)<<'\n';
}
}
return 0;
}