Pagini recente » Cod sursa (job #1052049) | Cod sursa (job #1262237) | Cod sursa (job #1910839) | Cod sursa (job #467716) | Cod sursa (job #2415615)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
const int SIGMA = 26;
struct Node
{
int nrap;
int nrc;
Node* fii[SIGMA];
Node()
{
nrap = nrc = 0;
memset(fii, NULL, sizeof(fii));
}
};
Node* InsertTrie(Node* node, char s[])
{
if(node == NULL)
node = new Node;
node-> nrap++;
if(s[0] == '\0')
node-> nrc++;
else
node-> fii[s[0] - 'a'] = InsertTrie(node-> fii[s[0] - 'a'], s + 1);
return node;
}
Node *DeleteTrie(Node* node, char s[])
{
if(s[0] == '\0')
node-> nrc--;
node-> nrap--;
if(node-> nrap == 0)
node = NULL;
if(s[0] != '\0')
node-> fii[s[0] - 'a'] = DeleteTrie(node-> fii[s[0] - 'a'], s + 1);
return node;
}
int ApTrie(Node* node, char s[])
{
if(s[0] == '\0')
return node-> nrc;
return ApTrie(node-> fii[s[0] - 'a'], s + 1);
}
int bestPref(Node *node, char s[])
{
if(node == NULL)
return -1;
if(s[0] == '\0')
return 0;
return 1 + bestPref(node-> fii[s[0] - 'a'], s + 1);
}
Node* trie;
int op;
char s[25];
int main()
{
while(fin >> op >> s)
{
if(op == 0)
trie = InsertTrie(trie, s);
else if(op == 1)
trie = DeleteTrie(trie, s);
else if(op == 2)
fout << ApTrie(trie, s) << '\n';
else
fout << bestPref(trie, s) << '\n';
}
return 0;
}