Pagini recente » Cod sursa (job #299364) | Cod sursa (job #1633943) | Cod sursa (job #2302785) | Cod sursa (job #256479) | Cod sursa (job #1873271)
#include <cstdio>
#include <cstring>
#define NMax 26
char s[NMax+1];
char a[NMax+1];
struct trie{
int nr;
int cnt;
trie * nxt[26];
void Init(){
for(int i = 0; i < 26; ++i) nxt[i] = NULL;
nr = cnt = 0;
}
};
trie* rad;
void Insert(char* cuv)
{
int i,j;
trie *q, *p = rad;
for(i = 0; cuv[i]; ++i)
{
p->nr++;
j = cuv[i] - 'a';
if(!p->nxt[j])
{
q = new trie;
q->Init();
p->nxt[j] = q;
}
p = p->nxt[j];
}
p->nr++;
p->cnt++;
}
void Delete(char* cuv)
{
int i,j;
trie *p = rad;
for(i = 0; cuv[i]; ++i)
{
p->nr--;
j = cuv[i] - 'a';
p = p->nxt[j];
}
p->nr--;
p->cnt--;
}
int Count(char* cuv)
{
int i,j;
trie *p = rad;
for(i = 0; cuv[i]; ++i)
{
j = cuv[i] - 'a';
p = p->nxt[j];
}
return p->cnt;
}
int Prefix(char* cuv)
{
int i,j;
trie *q, *p = rad;
for(i = 0; cuv[i]; ++i)
{
j = cuv[i] - 'a';
q = p->nxt[j];
if(q==NULL || !q->nr) return i;
p = q;
}
return i;
}
int main(){
FILE* fin = fopen("trie.in","r");
FILE* fout = fopen("trie.out","w");
int v,i,lg;
rad = new trie();
rad->Init();
while(fgets(s,NMax,fin) && !feof(fin))
{
v = s[0] - '0';
lg = strlen(s);
if(s[lg-1]=='\n') --lg;
for(i = 2; i < lg; ++i) a[i-2] = s[i];
a[lg-2] = '\0';
if(v==0) Insert(a);
else if(v==1) Delete(a);
else if(v==2) fprintf(fout,"%d\n",Count(a));
else fprintf(fout,"%d\n",Prefix(a));
}
fclose(fin);
fclose(fout);
return 0;
}