Pagini recente » Cod sursa (job #3248236) | Cod sursa (job #433142) | Cod sursa (job #2594166) | Cod sursa (job #265878) | Cod sursa (job #1162872)
#include <fstream>
#include <string>
#include <cstring>
#include <stack>
#define IN 0
#define OUT 1
#define FREC 2
#define MAXPREF 3
using namespace std;
class trie
{
private: ///=== private ===///
struct node
{
int endword, nr;
node *next[26];
node()
{
endword = 0;
nr = 0;
memset(next, 0, 104);
}
};
node *Root, *Temp;
public: ///=== public ===///
trie()
{
Root = new node;
}
void add (const string& s)
{
Temp = Root;
for (int i=0; i<s.length(); i++)
{
if (!Temp->next[s[i]-'a']) Temp->next[s[i]-'a'] = new node;
Temp = Temp->next[s[i]-'a'];
Temp->nr++;
}
Temp->endword++;
}
void eliminate (const string& s)
{
Temp = Root;
for (int i=0; i<s.length(); i++)
{
Temp = Temp->next[s[i]-'a'];
Temp->nr--;
}
Temp->endword --;
}
int get_frec(const string& s)
{
Temp = Root;
for (int i=0; i<s.length(); i++)
{
if (!Temp->next[s[i]-'a']) return 0;
Temp = Temp->next[s[i]-'a'];
}
return Temp->endword;
}
int get_prefix_length(const string& s)
{
Temp = Root;
int len=0;
while (Temp->next[s[len]-'a'] && Temp->next[s[len]-'a']->nr)
{
Temp = Temp->next[s[len]-'a'];
len++;
}
return len;
}
};
ifstream f("trie.in");
ofstream g("trie.out");
string current;
int type;
trie Words;
int main()
{
while (f >> type >> current)
{
if (type == IN) Words.add(current);
else if (type == OUT) Words.eliminate(current);
else if (type == FREC) g << Words.get_frec(current) << "\n";
else if (type == MAXPREF) g << Words.get_prefix_length(current) << "\n";
}
return 0;
}