Pagini recente » Cod sursa (job #977660) | Cod sursa (job #2768002) | Cod sursa (job #1726636) | Cod sursa (job #1486193) | Cod sursa (job #2126377)
#include <iostream>
#include <cstdio>
using namespace std;
char s[26];
struct Node
{
int nrCopii, aparitii;
Node *copii[26];
Node()
{
aparitii = 0;
nrCopii = 0;
for(int i=0; i<26; ++i)
copii[i] = NULL;
}
}*root;
void insertString(Node*& nod, char *p)
{
if(!*p)
{
nod->aparitii++;
return;
}
if(nod->copii[*p - 'a'])
insertString(nod->copii[*p - 'a'], p + 1);
else
{
nod->copii[*p - 'a'] = new Node;
nod->nrCopii++;
insertString(nod->copii[*p - 'a'], p + 1);
}
}
bool deleteString(Node*& nod, char *p)
{
if(!*p)
nod->aparitii--;
else if(deleteString(nod->copii[*p - 'a'], p+1))
{
nod->copii[*p - 'a'] = NULL;
nod->nrCopii--;
}
if(nod->aparitii == 0 && nod->nrCopii == 0 && nod != root)
{
delete nod;
return true;
}
return false;
}
int nrAparitii(Node*& nod, char *p)
{
if(!*p)
return nod->aparitii;
if(nod->copii[*p - 'a'] == NULL)
return 0;
return nrAparitii(nod->copii[*p - 'a'], p + 1);
}
int celMaiLungPrefix(Node*& nod, char *p, int lungime)
{
if(!*p || nod->copii[*p - 'a'] == NULL)
return lungime;
return celMaiLungPrefix(nod->copii[*p - 'a'], p + 1, lungime + 1);
}
void readOperations()
{
int operatie;
root = new Node;
while(scanf("%d %s", &operatie, &s) != EOF)
{
char *p = s;
if(operatie == 0)
insertString(root, p);
else if(operatie == 1)
deleteString(root, p);
else if(operatie == 2)
printf("%d\n", nrAparitii(root, p));
else
printf("%d\n", celMaiLungPrefix(root, p, 0));
}
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
readOperations();
return 0;
}