Pagini recente » Cod sursa (job #1685995) | Cod sursa (job #2356487) | Cod sursa (job #458166) | Cod sursa (job #297150) | Cod sursa (job #1491044)
//infoarena.ro - trie
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
typedef struct alma
{
alma* kov[26];
unsigned char darab[26];
unsigned char resze[26];
}ALMA;
alma* iinsert(alma* gy, char* w);
alma* rremove(alma* gy, char* w);
int qquery(alma* gy, char* w);
void prefix(alma* gy, char* w);
alma* gyoker=NULL;
int drb;
int main()
{
FILE* f=freopen("trie.in","r",stdin);
freopen("trie.out", "w", stdout);
int w;
char c;
char str[30];
int db;
while (!feof(f))
{
fscanf(f,"%d%c%s", &w, &c, str);
switch (w)
{
case 0: gyoker=iinsert(gyoker, str); break;
case 1: gyoker=rremove(gyoker, str); break;
case 2: db = qquery(gyoker, str); printf("%d\n", db); break;
case 3: drb = 0; prefix(gyoker, str); printf("%d\n", drb); break;
default:
break;
}
}
fcloseall();
return 0;
}
alma* iinsert(alma* gy, char* w)
{
if (gy == NULL)
{
gy = (alma*)malloc(sizeof(alma));
for (int i = 0; i < 26; ++i){ gy->kov[i] = NULL; gy->darab[i] = 0; gy->resze[i] = 0; }
}
int tag = *w - 'a';
if (w[1] == '\0')
{
gy->darab[tag]++;
gy->resze[tag]++;
return gy;
}
else
{
gy->kov[tag] = iinsert(gy->kov[tag], w + 1);
gy->resze[tag]++;
}
return gy;
}
alma* rremove(alma* gy, char* w)
{
int tag = *w - 'a';
if (w[1] == '\0')
{
gy->darab[tag]--;
gy->resze[tag]--;
}
else
{
gy->kov[tag] = rremove(gy->kov[tag], w + 1);
gy->resze[tag]--;
}
return gy;
}
int qquery(alma* gy, char* w)
{
if (gy == NULL)return 0;
if (w[0] == '\0')return 0;
int tag = *w - 'a';
if (w[1] == '\0')
{
return gy->darab[tag];
}
return qquery(gy->kov[tag],w+1);
}
void prefix(alma* gy, char* w)
{
if (gy == NULL)return;
if (w[0] == '\0')return;
int tag = *w - 'a';
if (gy->resze[tag] > 0)drb++;
prefix(gy->kov[tag], w + 1);
}