Pagini recente » Cod sursa (job #2051730) | Cod sursa (job #866175) | Cod sursa (job #340403) | Cod sursa (job #792240) | Cod sursa (job #664093)
Cod sursa(job #664093)
#include<fstream>
#include<string.h>
#include<stdlib.h>
using namespace std;
char sir[30];int maxim=0,nr=0;
struct arb
{
int info,nrfii;
arb*fiu[26];
arb()
{
for(int i=0;i<=26;i++)fiu[i]=0;
info=0;
nrfii=0;
}
}*trie;
void insereaza(arb *nd,char *s)// if(fiu[i]) <=> am muchie cu litera *s-'a',adica fiu[3]<=> am muchie cu 'b'
{
if(*s)
{
if(!nd->fiu[*s-'a']) { nd->nrfii++; nd->fiu[*s-'a']=new arb; }
insereaza(nd->fiu[*s-'a'],s+1);
}
else
{
nd->info++;
return;
}
}
void sterge(arb *nd,char *s)
{
if(*s)
sterge(nd->fiu[*s-'a'],s+1);
else
nd->info--;
}
long numara(arb *nd,char *s)//numarul de aparitii ale lui s
{
if(*s && nd->fiu[*s-'a'] )return numara(nd->fiu[*s-'a'],s+1);
else
return nd->info;
}
void lungime(arb *nd,char *s)//lungimea celui mai lung prefix comun al lui s cu oricare cuvant din lista
{
if(*s)
{
if( nd->info || (nd->nrfii && s+1))maxim=nr;
if(nd->fiu[*s-'a']) { nr++; lungime(nd->fiu[*s-'a'],s+1);}
}
else
{
if(nd->nrfii || nd->info>1)maxim=strlen(sir)-2;
return;
}
}
int main()
{
ifstream f("trie.in");ofstream g("trie.out");
trie=new arb;
while(f.getline(sir,30))
{
if(sir[0]=='0')insereaza(trie,sir+2);
else
if(sir[0]=='1')sterge(trie,sir+2);
else
if(sir[0]=='2')g<<numara(trie,sir+2)<<"\n";
else
if(sir[0]=='3'){ nr=0; lungime(trie,sir+2); g<<maxim<<"\n";}
}
f.close();g.close();
return 0;}