Pagini recente » Cod sursa (job #2301260) | Cod sursa (job #1384935) | Cod sursa (job #2812087) | Monitorul de evaluare | Cod sursa (job #1893692)
#include <fstream>
#include <cstring>
#define CH (*s - 'a')
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
int nrc;
int nrfii;
Trie *fii[26];
Trie()
{
nrc=nrfii=0;
memset(fii,0,sizeof(fii));
}
};
Trie *T= new Trie;
void adaug(Trie *p, char *s)
{
if(*s==0)
{
p->nrc++;
return;
}
if(p->fii[CH]==0)
{
p->fii[CH]=new Trie;
p->nrfii++;
}
adaug(p->fii[CH],s+1);
}
int elim( Trie *p, char *s)
{
if(*s==0)
p->nrc--;
else if(elim(p->fii[CH],s+1))
{
p->fii[CH]=0;
p->nrfii --;
}
if(p->nrc==0 && p->nrfii==0 && p!=T)
{
delete p;
return 1;
}
return 0;
}
int apar(Trie *p, char *s)
{
if(*s==0)
return p->nrc;
if(p->fii[CH])
return apar(p->fii[CH],s+1);
return 0;
}
int prefix(Trie *p, char *s, int k)
{
if(*s==0 || p->fii[CH]==0)
return k;
return prefix(p->fii[CH],s+1,k+1);
}
int main()
{
char s[32];
while(fin.getline(s, 31))
{
if(s[0]=='0')
adaug(T,s+2);
else if(s[0]=='1')
elim(T,s+2);
else if(s[0]=='2')
fout<<apar(T,s+2)<<'\n';
else fout<<prefix(T,s+2,0)<<'\n';
}
fin.close();
fout.close();
return 0;
}