Pagini recente » Cod sursa (job #975875) | Borderou de evaluare (job #732015) | Cod sursa (job #2173235) | Cod sursa (job #1200626) | Cod sursa (job #1965902)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <fstream>
#define CH (*s-'a')
using namespace std;
char line[32];
struct Trie{
int cnt, nrfii;
Trie *fiu[26];
Trie()
{
cnt=nrfii=0;
memset(fiu, 0, sizeof(fiu));
}
};
Trie *T=new Trie;
void Insert(Trie *nod, char *s)
{
if(*s=='\n')
nod->cnt++;
else
{if(nod->fiu[CH]==0)
{
nod->nrfii++;
nod->fiu[CH]=new Trie;
}
Insert(nod->fiu[CH],s+1);}
}
int Delete(Trie *nod, char *s)
{
if(*s=='\n')
nod->cnt--;
else
if(Delete(nod->fiu[CH],s+1))
{
nod->fiu[CH]=0;
nod->nrfii--;
}
if(nod->nrfii==0 && nod->cnt==0 && nod!=T)
{delete nod; return 1;}
return 0;
}
int Que(Trie *nod, char *s)
{
if(*s=='\n')
return nod->cnt;
else
if(nod->fiu[CH])
return Que(nod->fiu[CH],s+1);
else
return 0;
}
int Pre(Trie *nod, char *s, int x)
{
if(nod->fiu[CH]==0 || *s=='\n')
return x;
else
return Pre(nod->fiu[CH],s+1,x+1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
fgets(line, 25, stdin);
while(!feof(stdin))
{
switch(line[0]) {
case '0': Insert(T,line+2); break;
case '1': Delete(T,line+2); break;
case '2': printf("%d\n", Que(T,line+2)); break;
case '3': printf("%d\n", Pre(T,line+2,0)); break;
}
fgets(line, 25, stdin);
}
return 0;
}