Pagini recente » Cod sursa (job #787836) | Cod sursa (job #411155) | Cod sursa (job #2593291) | Cod sursa (job #589805) | Cod sursa (job #2724978)
//#include <iostream>
#include <fstream>
using namespace std;
const int alfabet=30;
struct Trie{
int nrcuv,nrfii;
Trie *fii[alfabet];
Trie(){
nrcuv=0;
nrfii=0;
for(int i=0;i<alfabet;i++){
fii[i]=0;
}
}
};
Trie *T=new Trie;
void add(Trie *nod,int ind,string s){
if(ind==s.size()){
nod->nrcuv++;
return;
}
if(nod->fii[s[ind]-'a']==0){
nod->nrfii++;
nod->fii[s[ind]-'a']=new Trie;
}
add(nod->fii[s[ind]-'a'],ind+1,s);
}
bool del(Trie *nod,int ind,string s){
if(ind==s.size()){
nod->nrcuv--;
}
else
if(del(nod->fii[s[ind]-'a'],ind+1,s)==1){
nod->fii[s[ind]-'a']=0;
nod->nrfii--;
}
if(nod!=T and nod->nrcuv==0 and nod->nrfii==0){
delete nod;
return 1;
}
return 0;
}
int aparitii(Trie *nod,int ind,string s){
if(ind==s.size()){
return nod->nrcuv;
}
if(nod->fii[s[ind]-'a']==0){
return 0;
}
return aparitii(nod->fii[s[ind]-'a'],ind+1,s);
}
int prefix(Trie *nod,int ind,string s){
if(ind==s.size() or nod->fii[s[ind]-'a']==0){
return ind;
}
return prefix(nod->fii[s[ind]-'a'],ind+1,s);
}
int main()
{
ifstream cin("trie.in");
ofstream cout("trie.out");
char ch;
string s;
while(cin>>ch){
if(ch=='4')
break;
cin>>s;
if(ch=='0'){
///adauga s;
add(T,0,s);
}
if(ch=='1'){
///sterge s;
del(T,0,s);
}
if(ch=='2'){
///aparitii s;
cout<<aparitii(T,0,s)<<"\n";
}
if(ch=='3'){
///cel mai lung prefix s;
cout<<prefix(T,0,s)<<"\n";
}
}
return 0;
}