Pagini recente » Cod sursa (job #483075) | Cod sursa (job #351831) | Cod sursa (job #1389912) | Cod sursa (job #1026736) | Cod sursa (job #302829)
Cod sursa(job #302829)
#include <stdio.h>
#include <string.h>
#define LM 21
char w[LM];
int n;
int alfa;
struct trie{int nr,fii;
trie *urm[26];
trie()
{nr=fii=0;
for (int i=0;i<26;i++) urm[i]=NULL;
}
};
trie *r=new trie;
void add(trie*,int);
int del(trie*,int);
int nrap(trie*,int);
int pref(trie*,int);
int main()
{freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int i;
for (i=0;i<26;i++) r->urm[i]=NULL;
while (!feof(stdin))
{scanf("%d %s\n",&i,w);
n=strlen(w);
switch(i)
{case 0: add(r,0);break;
case 1: del(r,0);break;
case 2: printf("%d\n",nrap(r,0));break;
case 3: printf("%d\n",pref(r,0));break;
}
if (alfa==57984)
{i=i;
i=i;
n=i;
}
alfa++;
}
return 0;
}
/********/
void add(trie *p,int i)
{if (i==n)
{p->nr++;
return;
}
if (p->urm[w[i]-'a']==NULL)
{p->urm[w[i]-'a']=new trie;
p->fii++;
}
add(p->urm[w[i]-'a'],i+1);
}
int del(trie *p,int i)
{if (i==n)
{p->nr--;
if (p->fii==0&&p->nr==0)
{delete p;
return 1;
}
return 0;
}
if (del(p->urm[w[i]-'a'],i+1))
{p->fii--;
p->urm[w[i]-'a']=NULL;
}
if (p->nr==0&&p->fii==0&&p!=r)
{delete p;
return 1;
}
return 0;
}
int nrap(trie *p,int i)
{if (i==n) return p->nr;
if (p->urm[w[i]-'a']==NULL) return 0;
return nrap(p->urm[w[i]-'a'],i+1);
}
int pref(trie *p,int i)
{if (i==n) return n;
if (p->urm[w[i]-'a']==NULL)
return i;
return pref(p->urm[w[i]-'a'],i+1);
}