Pagini recente » Cod sursa (job #3241631) | Cod sursa (job #130018) | Monitorul de evaluare | Cod sursa (job #3258725) | Cod sursa (job #1070530)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
int cnt, nr;
Trie *fiu[26];
Trie()
{
cnt=nr=0;
memset(fiu, 0, sizeof(fiu));
}
};
Trie *T=new Trie;
void tinsert(Trie *nod, char *s)
{
if(*s=='\0')
{
nod->cnt++;
return;
}
if(nod->fiu[*s-'a']==0)
{
nod->fiu[*s-'a']=new Trie;
nod->nr++;
}
tinsert(nod->fiu[*s-'a'], s+1);
}
int tdelete(Trie *nod, char *s)
{
if(*s=='\0') nod->cnt--;
else if(tdelete(nod->fiu[*s-'a'], s+1))
{
nod->nr--;
nod->fiu[*s-'a']=0;
}
if(nod->cnt==0&&nod->nr==0&&nod!=T)
{
delete nod;
return 1;
}
return 0;
}
int tquery(Trie *nod, char *s)
{
if(*s=='\0') return nod->cnt;
if(nod->fiu[*s-'a']) return tquery(nod->fiu[*s-'a'], s+1);
return 0;
}
int tprefix(Trie *nod, char *s, int k)
{
if(*s=='\0'||nod->fiu[*s-'a']==0) return k;
if(nod->fiu[*s-'a']) return tprefix(nod->fiu[*s-'a'], s+1, k+1);
return 0;
}
int main()
{
char cit[35];
while(fin.getline(cit, 40))
{
if(cit[0]=='0') tinsert(T, cit+2);
else if(cit[0]=='1') tdelete(T, cit+2);
else if(cit[0]=='2') fout<<tquery(T, cit+2)<<"\n";
else fout<<tprefix(T, cit+2, 0)<<"\n";
}
fin.close();
fout.close();
}