Pagini recente » Cod sursa (job #3041330) | Monitorul de evaluare | Monitorul de evaluare | Istoria paginii utilizator/laurentiu445 | Cod sursa (job #418864)
Cod sursa(job #418864)
#include <fstream>
using namespace std;
char s[100];
struct trie
{
long val,fi;
trie * kov[26];
trie()
{
val=fi=0;
memset(kov,0,sizeof kov);
}
};
trie *g=new trie;
int insert(trie *nod,char *p)
{
if (*p=='\0')
{
nod->val++;
} else
{
int h=*p-'a';
if (nod->kov[h]==0)
{
nod->kov[h]=new trie;
nod->fi++;
}
insert(nod->kov[h],++p);
}
return 0;
}
int dele(trie *nod,char *p)
{
if (*p=='\0')
nod->val--;
else
{
int h=*p-'a';
if (dele(nod->kov[h],++p)==1)
{
nod->kov[h]=0;
nod->fi--;
}
}
if (nod->val==0 && nod->fi==0 && nod!=g)
{
delete nod;
return 1;
}
return 0;
}
long query(trie *nod,char *p)
{
if (*p=='\0' ) return nod->val; else
{
int h=*p-'a';
if (nod->fi!=0&&nod->kov[h]!=0) return query(nod->kov[h],++p);
}
return 0;
}
long pre(trie *nod,char *p,long ho)
{
int h=*p-'a';
if (*p=='\0' || nod->kov[h]==0) return ho; else
return pre(nod->kov[h],++p,++ho);
return 0;
}
int main()
{
ifstream in("trie.in");
ofstream out("trie.out");
//long num=0;
while (in.good())
{
in.getline(s,100);
//out << s << "\n";
//++num;
if (s[0]=='0') insert(g,s+2); else
if (s[0]=='1') dele(g,s+2); else
if (s[0]=='2') out << query(g,s+2) << "\n"; else
if (s[0]=='3') out << pre(g,s+2,0) << "\n";
}
//out << "\n" << num;
in.close();
out.close();
return 0;
}