Pagini recente » Cod sursa (job #849866) | Cod sursa (job #1283544) | Cod sursa (job #1787952) | Cod sursa (job #2766506) | Cod sursa (job #770768)
Cod sursa(job #770768)
#include <fstream>
#include <cstring>
using namespace std;
struct Trie
{
int fii,ap;
Trie *fiu[26];
Trie()
{
fii=ap=0;
memset(fiu,0,sizeof(fiu));
}
};
ifstream in("trie.in");
ofstream out("trie.out");
Trie *A=new Trie;
char a[50];
int ltt=0,ok=1;
void ins(Trie *nod,char *s)
{
if(*s=='\n')
{
nod->ap++;
return;
}
if(nod->fiu[*s-'a']==0)
{
nod->fiu[*s-'a']=new Trie;
nod->fii++;
}
ins(nod->fiu[*s-'a'],s+1);
}
void del(Trie *nod,char *s)
{
if(*s=='\n')
{
nod->ap--;
if(nod->fii || nod->ap) ok=0;
return;
}
if(nod->fiu[*s-'a'])
{
del(nod->fiu[*s-'a'],s+1);
}
if(ok)
{
if(nod->fii==1 && nod->ap==0)
{
nod->fiu[*s-'a']=0;
}
else
{
nod->fiu[*s-'a']=0;
ok=0;
}
}
}
/*int del( Trie *nod, char *s )
{
if( *s == '\n' )
{
nod->ap --;
}
else
if( del( nod->fiu[ *s-'a' ], s+1 ) ) {
nod->fiu[ *s-'a' ] = 0;
nod->fii --;
}
if( nod->ap == 0 && nod->fii == 0 && nod != A )
{
delete nod; return 1;
}
return 0;
}*/
int doi(Trie *nod,char *s)
{
if(*s=='\n')
{
return nod->ap;
}
if(nod->fiu[*s-'a'])
{
return doi(nod->fiu[*s-'a'],s+1);
}
return 0;
}
int trei(Trie *nod,char *s,int lvl)
{
if(*s=='\n')
{
return lvl;
}
if(nod->fiu[*s-'a'])
{
return trei(nod->fiu[*s-'a'],s+1,lvl+1);
}
else
{
return lvl;
}
}
int main()
{
while(in.getline(a,49))
{
a[strlen(a)]='\n';
//out<<a;
if(a[0]=='0')
{
ins(A,a+2);
}
else
if(a[0]=='1')
{
ok=1;
del(A,a+2);
}
else
if(a[0]=='2')
{
out<<doi(A,a+2)<<'\n';
}
else
if(a[0]=='3')
{
out<<trei(A,a+2,0)<<'\n';
}
memset(a,'\0',sizeof(a));
}
out.close();
return 0;
}