Pagini recente » Cod sursa (job #1746969) | Cod sursa (job #144675) | Cod sursa (job #37717) | Cod sursa (job #2862718) | Cod sursa (job #652528)
Cod sursa(job #652528)
#include <iostream>
using namespace std;
struct Trie
{
int wAp, prefAp, noLeg;
Trie *leg[26];
Trie() {
wAp = noLeg = prefAp = 0;
for (int i = 0; i < 26; i++)
{
leg[i] = NULL;
}
}
};
Trie *root = new Trie;
FILE *f = fopen("trie.in", "r");
FILE *g = fopen("trie.out", "w");
void insert(char *s)
{
Trie *currentNode = root;
for (int i = 0; i < strlen(s); i++)
{
char lit = s[i] - 97;
if (currentNode->leg[lit] == NULL)
{
currentNode->leg[lit] = new Trie;
currentNode->noLeg++;
}
if (i == strlen(s) - 1)
{
currentNode->leg[lit]->wAp++;
}
currentNode->leg[lit]->prefAp++;
currentNode = currentNode->leg[lit];
}
}
void del(char *s)
{
char lit = s[0] - 97;
Trie *currentNode = root->leg[lit], *tempNode, *parentNode = root;
for (int i = 0; i < strlen(s); i++)
{
if (currentNode->prefAp > 1)
{
currentNode->prefAp--;
if (currentNode->wAp > 0)
{
currentNode->wAp--;
}
}
else
{
parentNode->leg[lit] = NULL;
delete currentNode;
}
if (i + 1 >= strlen(s))
break;
lit = s[i + 1] - 97;
parentNode = currentNode;
currentNode = currentNode->leg[lit];
}
}
int apar(char *s)
{
Trie *currentNode = root;
for (int i = 0; i < strlen(s); i++)
{
char lit = s[i] - 97;
currentNode = currentNode->leg[lit];
if (currentNode == NULL)
{
break;
}
}
return currentNode->wAp;
}
int pref(char *s)
{
Trie *currentNode = root;
int lung = 0;
for (int i = 0; i < strlen(s); i++)
{
char lit = s[i] - 97;
currentNode = currentNode->leg[lit];
if (currentNode == NULL)
{
return lung;
}
lung++;
}
return lung;
}
int main()
{
int op;
char param[23];
while (fscanf(f, "%d %s", &op, ¶m) != EOF)
{
switch (op)
{
case 0: insert(param); break;
case 1: del(param); break;
case 2: fprintf(g, "%d\n", apar(param)); break;
case 3: fprintf(g, "%d\n", pref(param)); break;
}
}
}