Pagini recente » Cod sursa (job #2975400) | Cod sursa (job #2326777) | Cod sursa (job #2460758) | Cod sursa (job #3031219) | Cod sursa (job #343103)
Cod sursa(job #343103)
#include<fstream>
#define CH (*s - 'a')
using namespace std;
struct trie
{int nrfii,cnt;
trie *fiu[26];
trie()
{nrfii=0;cnt=0;memset(fiu,0,sizeof(fiu));
}
};
trie *T=new trie;
void insert(trie *nod, char *s)
{if(*s=='\n') {nod->cnt++;return;}
if(nod->fiu[CH]==0) {nod->fiu[CH]=new trie;nod->nrfii++; }
insert(nod->fiu[CH],s+1);
}
int remove(trie *nod, char *s)
{if(*s=='\n') nod->cnt--;
else if(remove(nod->fiu[CH],s+1)) {
nod->fiu[CH]=0;nod->nrfii--;
}
if(nod->nrfii==0 && nod->cnt==0 && nod!=T)
{delete nod; return 1;}
return 0;
}
int query(trie *nod, char *s)
{if(*s=='\n') return nod->cnt;
if(nod->fiu[CH]) return query(nod->fiu[CH],s+1);
return 0;
}
int prefix(trie *nod,char *s, int k)
{if(*s=='\n' || nod->fiu[CH]==0) return k;
else return prefix(nod->fiu[CH],s+1,k+1);
}
int main()
{freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
char linie[32];
fgets(linie,32,stdin);
while(!feof(stdin))
{switch(linie[0])
{case '0': {insert(T,linie+2);break;}
case '1': {remove(T,linie+2);break;}
case '2': {printf("%d \n",query(T,linie+2));break;}
case '3':{printf("%d \n",prefix(T,linie+2,0));break;}
default:break;
}
fgets(linie,32,stdin);}
return 0;}