Pagini recente » Cod sursa (job #1587339) | Cod sursa (job #796837) | Cod sursa (job #1570598) | Cod sursa (job #2866137) | Cod sursa (job #2307495)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
class Node{
public:
int nrap, nrc;
Node *fii[26];
Node(){
for(int i = 0; i < 26; i++)
fii[i] = NULL;
nrap = nrc = 0;
}
};
Node* insert_trie(Node* node, char *s)
{
if(node == NULL) node = new Node;
node-> nrap++;
if(s[0] == '\0')
node-> nrc++;
else
node-> fii[s[0] - 'a'] = insert_trie(node-> fii[s[0] - 'a'], s + 1);
return node;
}
Node* delete_trie(Node* node, char *s)
{
node-> nrap--;
if(s[0] == '\0')
node-> nrc--;
else
node-> fii[s[0] - 'a'] = delete_trie(node-> fii[s[0] - 'a'], s + 1);
if(node-> nrap == 0)
{
delete node;
node = NULL;
}
return node;
}
int nrap(Node* node, char *s)
{
if(node == NULL)
return 0;
if(*s == '\0')
return node-> nrc;
return nrap(node-> fii[s[0] - 'a'], s + 1);
}
int bestPref(Node* node, char *s)
{
if(node == NULL)
return -1;
if(*s == '\0')
return 0;
return 1 + bestPref(node-> fii[s[0] - 'a'], s + 1);
}
int main()
{
Node* trie = NULL;
char c, s[21];
while(fin >> c)
{
fin >> s;
if(c == '0') trie = insert_trie(trie, s);
else if(c == '1') trie = delete_trie(trie, s);
else if(c == '2') fout << nrap(trie, s) << '\n';
else fout << bestPref(trie, s) << '\n';
}
return 0;
}