Pagini recente » Cod sursa (job #265782) | Cod sursa (job #524206) | Cod sursa (job #525738) | Cod sursa (job #3182698) | Cod sursa (job #269176)
Cod sursa(job #269176)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Lmax 20
class Nod
{
public : int cnt;
public : Nod ** fii;
public : void Inc()
{
++cnt;
}
public : void Dec()
{
--cnt;
}
public : Nod()
{
cnt = 0;
fii = (Nod **) calloc(26, sizeof(Nod*));
}
public : ~Nod()
{
delete[] fii;
}
public : void AddRel(char c)
{
if (fii[c - 'a'] == NULL)
fii[c-'a'] = new Nod();
fii[c-'a']->Inc();
}
public : int Cnt()
{
return cnt;
}
public : Nod * Fiu(char c)
{
return fii[c-'a'];
}
};
class Trie
{
private : Nod * root;
public : Trie()
{
root = new Nod();
}
public: void Add(char * s)
{
Nod * p =root;
for (int i = 0, L = strlen(s); i<L; ++i)
{
p->AddRel(s[i]);
p = p->Fiu(s[i]);
}
}
private : int rm(Nod * p, int loc, int L, char *s)
{
if (loc < L-1)
if (rm(p->Fiu(s[loc+1]),loc+1,L,s))
{
p->fii[s[loc+1]-'a'] = 0;
}
p->Dec();
if (!p->Cnt())
{
free(p);
p = NULL;
return 1;
}
return 0;
}
public : void Rem(char *s)
{
if (rm(root->Fiu(s[0]),0,strlen(s),s))
root->fii[s[0]] = 0;
}
public : int Count(char *s)
{
int i, L;
Nod * p = root;
for (i = 0, L = strlen(s); i<L; ++i)
if (p->Fiu(s[i]) == NULL) return 0;
else p = p->Fiu(s[i]);
int rez = p->Cnt();
for (i = 0; i <= 'z' - 'a'; ++i)
if (p->Fiu(i + 'a') != NULL)
rez -= p -> Fiu('a' + i) -> Cnt();
return rez;
}
public : int Prefix(char *s)
{
Nod * p = root;
for (int i = 0, L = strlen(s); i<L; ++i)
if (p->Fiu(s[i]) == NULL ) return i;
else p = p->Fiu(s[i]);
return strlen(s);
}
};
int o;
char S[Lmax];
Trie T;
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
while (!feof(stdin))
{
memset(S,0,20);
scanf("%d %s\n", &o, &S);
switch(o)
{
case 0 : T.Add(S); break;
case 1 : T.Rem(S); break;
case 2 : printf("%d\n", T.Count(S)); break;
case 3 : printf("%d\n", T.Prefix(S)); break;
}
}
return 0;
}