Pagini recente » Cod sursa (job #742469) | Cod sursa (job #1067639) | Cod sursa (job #1911005) | Cod sursa (job #72418) | Cod sursa (job #308829)
Cod sursa(job #308829)
#include<stdio.h>
#include<string.h>
const int nmax='z'-'a'+1;
struct trie {
int cnt,nf;
trie* f[nmax];
trie() {
cnt=nf=0;
for(int i=0;i<nmax;i++) f[i]=NULL;
}
} *p=new trie;
int op;
char w[20];
void adauga(char w[]) {
trie *q=p;
int l=strlen(w);
for(int i=0;i<l;i++) {
if(!q->f[w[i]-'a']) q->f[w[i]-'a']=new trie;
q=q->f[w[i]-'a'];
q->nf++;
}
q->cnt++;
}
void sterge(char w[]) {
trie *q=p;
int l=strlen(w);
for(int i=0;i<l;i++) {
if(q->f[w[i]-'a']->nf==1) {
q->f[w[i]-'a']=NULL;
return;
}
q=q->f[w[i]-'a'];
q->nf--;
}
q->cnt--;
}
int nrcuv(char w[]) {
trie *q=p;
int l=strlen(w),i=0;
while((i<l)&&q->f[w[i]-'a']) q=q->f[w[i++]-'a'];
if(q) return q->cnt; else return 0;
}
int lungpref(char w[]) {
trie *q=p;
int l=strlen(w),i=0;
while((i<l)&&q->f[w[i]-'a']) q=q->f[w[i++]-'a'];
return i;
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while(!feof(stdin)) {
scanf("%d %s",&op,w);
switch(op) {
case 0: adauga(w); break;
case 1: sterge(w); break;
case 2: printf("%d\n",nrcuv(w)); break;
case 3: printf("%d\n",lungpref(w)); break;
}
}
fclose(stdout);
return 0;
}