Pagini recente » Cod sursa (job #2287197) | Cod sursa (job #2910169) | Cod sursa (job #1775083) | Cod sursa (job #321392) | Cod sursa (job #2336141)
#include <fstream>
#include <string.h>
#pragma pack(1)
#pragma GCC optimize ("O3")
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
unsigned short aparitii,fii;
trie *fiu[26];
trie()
{
aparitii=fii=0;
memset(fiu,0,sizeof(fiu));
}
}*tata;
void adauga(trie *nod,char *s)
{
if(*s==NULL)
{
nod->aparitii++;
return;
}
if(!nod->fiu[*s-'a'])
{
nod->fiu[*s-'a']=new trie;
nod->fii++;
}
adauga(nod->fiu[*s-'a'],s+1);
}
void sterge(trie *nod,char *s)
{
if(*s==NULL)
{
nod->aparitii--;
return ;
}
sterge(nod->fiu[*s-'a'],s+1);
if(!nod->fiu[*s-'a']->fii && !nod->fiu[*s-'a']->aparitii)
{
delete nod->fiu[*s-'a'];
nod->fii--;
nod->fiu[*s-'a']=NULL;
}
}
int numar(trie *nod, char *s)
{
if(*s==NULL)
return nod->aparitii;
if(!nod->fiu[*s-'a'])
return 0;
return numar(nod->fiu[*s-'a'],s+1);
}
int prefix(trie *nod, char *s)
{
if(*s==NULL)
return 0;
if(!nod->fiu[*s-'a'])
return 0;
return prefix(nod->fiu[*s-'a'],s+1)+1;
}
int main()
{
tata=new trie;
char cuv[25];
unsigned short op;
while(fin>>op>>cuv)
{
if(op==0)
{
adauga(tata,cuv);
continue;
}
if(op==1)
{
sterge(tata,cuv);
continue;
}
if(op==2)
{
fout<<numar(tata,cuv)<<"\n";
continue;
}
fout<<prefix(tata,cuv)<<"\n";
}
return 0;
}