Mai intai trebuie sa te autentifici.
Cod sursa(job #415945)
Utilizator | Data | 11 martie 2010 23:33:07 | |
---|---|---|---|
Problema | Trie | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.32 kb |
#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=='\n')
{
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=='\n')
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=='\n' ) return nod->val; else
{
int h=*p-'a';
if (nod->fi!=0) return query(nod->kov[h],p++);
}
return 0;
}
long pre(trie *nod,char *p,long ho)
{
int h=*p-'a';
if (*p=='\n' || 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");
while (in.good())
{
in >> s;
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
out << pre(g,s+2,0) << "\n";
}
in.close();
out.close();
return 0;
}