Pagini recente » Cod sursa (job #2124061) | Cod sursa (job #2983862) | Cod sursa (job #2887301) | Cod sursa (job #1403447) | Cod sursa (job #2075012)
#include <iostream>
#include <cstdio>
using namespace std;
char s[25];
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 lungMaxPrefix(Node*& nod, char *p, int raspuns)
{
if(!*p || nod->copii[*p - 'a'] == NULL)
return raspuns;
return lungMaxPrefix(nod->copii[*p - 'a'], p + 1, raspuns + 1);
}
void readOperations()
{
int operatie = -1;
root = new Node;
while(scanf("%d %s\n", &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", lungMaxPrefix(root, p, 0));
}
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
readOperations();
return 0;
}