Pagini recente » Cod sursa (job #1633685) | Cod sursa (job #1620165) | Cod sursa (job #1111648) | Cod sursa (job #3265005) | Cod sursa (job #1922041)
//Implementare TRIE
#include<fstream>
#include<vector>
#include<string>
#define modulo 666013
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Node
{
int finish, prefix;
Node *urm[26];
Node()
{
//fout << "ajunge"<<"\n";
finish = prefix = 0;
for(int i = 0; i < 26; i++)
{
urm[i] = NULL;
}
}
};
void adauga(Node *node, int pos, string &sir)
{
if(pos == sir.length())
{
node -> finish++;
return;
}
int letter = sir[pos] - 'a';
if(node -> urm[letter] == NULL)
{
node -> urm[letter] = new Node();
}
node -> urm[letter] -> prefix++;
adauga(node -> urm[letter], pos + 1, sir);
}
void sterge(Node *node, int pos, string &sir)
{
if (pos == sir.size()) {
node -> finish--;
return;
}
int letter = sir[pos] - 'a';
node -> urm[letter] -> prefix--;
sterge(node -> urm[letter], pos + 1, sir);
if(node -> urm[letter] -> prefix == 0)
{
node -> urm[letter] = NULL;
//vreau sa sterg nodul
}
}
int cauta(Node *node, int pos, string &sir)
{
if(pos == sir.length())
{
return node->finish;
}
int letter = sir[pos] - 'a';
if(node -> urm[letter] == NULL)
{
return 0;
}
return cauta(node -> urm[letter], pos + 1, sir);
}
int prefix(Node *node, int pos, string &sir)
{
if(pos == sir.length())
{
return sir.size();
}
int letter = sir[pos] - 'a';
if(node -> urm[letter] == NULL)
{
return pos;
}
return prefix(node -> urm[letter], pos + 1, sir);
}
string sir;
int i, n, k, j,contor,st,dr,sol,x,y;
int main()
{
Node *root = new Node();
while(fin >> x >> sir)
{
//fout << sir << "\n";
if(x == 0)
{
adauga(root, 0, sir);
}
if(x == 1)
{
sterge(root, 0, sir);
}
if(x == 2)
{
fout << cauta(root, 0, sir) << "\n";
}
if(x == 3)
{
fout << prefix(root, 0, sir) << "\n";
}
}
}