Pagini recente » Cod sursa (job #960464) | Cod sursa (job #995772) | Cod sursa (job #811863) | Istoria paginii runda/road_to_ioi_7/clasament | Cod sursa (job #770463)
Cod sursa(job #770463)
#include <fstream>
#include <cstring>
using namespace std;
struct Trie
{
int fii,ap;
Trie *fiu[26];
Trie()
{
fii=ap=0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *A=new Trie;
char a[50];
int ltt=0;
void ins(Trie *nod,char *s)
{
if(*s=='\n')
{
nod->ap++;
if(nod->ap==0)
{
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->ap==0)
{
nod->ap--;
}
return;
}
if(nod->fiu[*s-'a'])
{
del(nod->fiu[*s-'a'],s+1);
}
}
int doi(Trie *nod,char *s)
{
if(*s=='\n')
{
return (nod->ap>0?nod->ap:0);
}
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'] && ((nod->fiu[*s-'a'])->ap!=-1 || ((nod->fiu[*s-'a'])->fiu[*(s+1)-'a'])))
{
return trei(nod->fiu[*s-'a'],s+1,lvl+1);
}
else
{
return lvl;
}
}
int main()
{
ifstream in("trie.in");
ofstream out("trie.out");
while(in.getline(a,49))
{
a[strlen(a)]='\n';
//out<<a;
if(a[0]=='0')
{
ins(A,a+2);
}
else
if(a[0]=='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;
}