Pagini recente » Cod sursa (job #562963) | Cod sursa (job #164157) | Cod sursa (job #1533523) | Cod sursa (job #3212613) | Cod sursa (job #392131)
Cod sursa(job #392131)
#include <cstdio>
#include <string>
#include <cstdlib>
struct nod
{
nod *next[26];
int nrAparitii;
int nrSons;
nod()
{
memset(next, 0, sizeof(next));
nrAparitii = 0;
nrSons = 0;
}
};
nod *root;
void init()
{
root = new nod;
}
inline void insert(nod *R, char a[], int n)
{
int i;
nod *T = R;
for(i = 0; i < n; ++i)
{
if(T->next[a[i] - 'a'] == NULL)
{
T->next[a[i] - 'a'] = new nod;
++T->nrSons;
}
T = T->next[a[i] - 'a'];
}
++T->nrAparitii;
}
inline int erase(nod *R, char a[], int n)
{
if(R == NULL) return 0;
if(a[n] == 0)
-- R->nrAparitii;
else
if(erase(R->next[a[n] - 'a'], a, n + 1))
R->next[a[n] - 'a'] = NULL,
--R->nrSons;
if(R->nrSons == 0 && R->nrAparitii == 0 && R != root)
{
delete R;
return 1;
}
return 0;
}
inline int nrAparitii(nod *R, char a[], int n)
{
int i;
nod *T = R;
for(i = 0; i < n; ++i)
{
if(T->next[a[i] - 'a'] == NULL) return 0;
T = T->next[a[i] - 'a'];
}
return T->nrAparitii;
}
inline int lcp(nod *R, char a[], int n)
{
int i;
nod *T = R;
for(i = 0; i < n; ++i)
{
if(T->next[a[i] - 'a'] == NULL) return i;
T = T->next[a[i] - 'a'];
}
return n;
}
int main()
{
init();
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
char a[32];
int t;
while(scanf("%d %s\n", &t, &a) > 0)
{
a[strlen(a)] = 0;
if(t == 0) insert(root, a, strlen(a));
if(t == 1) erase(root, a, 0);
if(t == 2) printf("%d\n", nrAparitii(root, a, strlen(a)));
if(t == 3) printf("%d\n", lcp(root, a, strlen(a)));
}
return 0;
}