Pagini recente » Cod sursa (job #907766) | Cod sursa (job #1330365) | Cod sursa (job #147056) | Cod sursa (job #1585587) | Cod sursa (job #2362314)
#include<fstream>
#include<string.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Trie{
int cnt, nrfii;
Trie *fiu[ 26 ];
Trie() {
cnt = nrfii = 0;
for(int i=0;i<26;i++)
fiu[i]=0;
}
};
Trie *t = new Trie;
char S[100];
void ins( Trie *nod, char *s ) {
if( *s == 0 ) {
nod->cnt ++; return;
}
if( nod->fiu[ *s-'a' ] == 0 ) {
nod->fiu[ *s-'a' ] = new Trie;
nod->nrfii ++;
}
ins( nod->fiu[ *s-'a' ], s+1 );
}
void afisare(Trie *nod,int poz){
if(nod->cnt)
{
S[poz]=0;
g<<S<<"\n";
}
if(nod->nrfii)
for(int i=0;i<26;i++)
if(nod->fiu[i])
{
S[poz]=i+'a';
afisare(nod->fiu[i],poz+1);
}
}
int que( Trie *nod, char *s ) {
if( *s == 0)
return nod->cnt;
if( nod->fiu[ *s-'a' ] )
return que( nod->fiu[ *s-'a' ], s+1 );
return 0;
}
int del(Trie *nod, char *s)
{
if(*s==0)
nod->cnt--;
else if(del(nod->fiu[*s-'a'],s+1))
{
nod->fiu[*s-'a']=0;
nod->nrfii--;
}
if(nod->cnt==0&&nod->nrfii==0&&nod!=t)
{
delete nod;
return 1;
}
return 0;
}
int pre(Trie *nod, char *s, int k)
{
if(*s==0||nod->fiu[*s-'a']==0)
return k;
return pre(nod->fiu[*s-'a'],s+1,k+1);
}
int main()
{
char s[32];
int x;
while(f.get(s,32)) {
f.get();
switch(s[0])
{
case '0':ins(t,s+2);break;
case '1':del(t,s+2);break;
case '2':g<<que(t,s+2)<<"\n";break;
case '3':g<<pre(t,s+2,0)<<"\n";;break;
}
}
//afisare(t,0);
}