Pagini recente » Cod sursa (job #147351) | Cod sursa (job #2572461) | Cod sursa (job #1104615) | Cod sursa (job #1538251) | Cod sursa (job #781037)
Cod sursa(job #781037)
#include<fstream>
using namespace std;
char buff[30];
int intc;
struct trie
{int nr,nrfii;
trie* son[26];
trie()
{nr=0; nrfii=0;
for(int psi=0; psi<26; psi++)
son[psi]=0;}
};
trie *T=new trie;
void add(trie *nod, char *buff)
{if(*buff<'a' || *buff>'z')
{nod->nr++;
return;}
intc=*buff-'a';
if(nod->son[intc]==0)
{nod->son[intc]=new trie;
nod->nrfii++;}
add(nod->son[intc],buff+1);
}
int erase(trie *nod, char *buff)
{if(*buff<'a' || *buff>'z')
{nod->nr--;}
else
{intc=*buff-'a';
if(erase(nod->son[intc],buff+1)==1)
{nod->son[intc]=0;
nod->nrfii--;}
}
if(nod->nr==0 && nod->nrfii==0 && nod!=T)
{delete nod;
return 1;}
return 0;
}
int count(trie *nod, char *buff)
{if(*buff<'a' || *buff>'z')
return nod->nr;
intc=*buff-'a';
if(nod->son[intc]!=0)
return count(nod->son[intc],buff+1);
return 0;
}
int prefix(trie *nod, char *buff,int grad)
{if(*buff<'a' || *buff>'z')
return grad;
intc=*buff-'a';
if(nod->son[intc]!=0)
return prefix(nod->son[intc],buff+1,grad+1);
return grad;
}
int main()
{freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while(gets(buff))
{switch(buff[0]-'0')
{case 0: add(T,buff+2); break;
case 1: erase(T,buff+2); break;
case 2: printf("%d\n",count(T,buff+2)); break;
case 3: printf("%d\n",prefix(T,buff+2,0)); break;}
}
return 0;}