Pagini recente » Cod sursa (job #1654743) | Cod sursa (job #200184) | Cod sursa (job #1696850) | Cod sursa (job #1472489) | Cod sursa (job #420098)
Cod sursa(job #420098)
#include <fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
char s[100];
struct trie
{
int fii,x;
trie *tr[30];
trie()
{
fii=x=0;
for(int i=0;i<30;i++)
tr[i]=NULL;
}
};
trie *T=new trie;
void add(trie *&nod,char *c)
{
if(*c=='\0')
{
nod->x++;
return;
}
int h=*c-'a';
if(nod->tr[h]!=NULL)
{
nod->fii++;
add(nod->tr[h],++c);
}
else
{
//trie *p=new trie;
nod->tr[h]=new trie;
nod->fii++;
add(nod->tr[h],++c);
}
}
int del(trie *&nod,char *c)
{
if(*c=='\0')
nod->x--;
else if(del(nod->tr[int(*c-'a')],c+1)==1)
{
nod->tr[int(*c-'a')]=0;
nod->fii--;
}
if(nod->fii==0 && nod!=T && nod->x==0)
{
delete nod;
return 1;
}
return 0;
}
int query(trie *nod,char *c)
{
if(*c=='\0')
return nod->x;
if(nod==NULL)
return 0;
return query(nod->tr[int(*c-'a')],c+1);
}
int pref(trie *nod,char *c,int nr)
{
if(nod->tr[int(*c-'a')]==NULL)
return nr;
return pref(nod->tr[int(*c-'a')],c+1,nr+1);
}
int main()
{
while(f.getline(s,100))
{
if(s[0]=='0') add(T,s+2);
else if(s[0]=='1') del(T,s+2);
else if(s[0]=='2') g<<query(T,s+2)<<endl;
else if(s[0]=='3') g<<pref(T,s+2,0)<<endl;
}
return 0;
}