Pagini recente » Cod sursa (job #739915) | Cod sursa (job #2466385) | Cod sursa (job #292941) | Cod sursa (job #534102) | Cod sursa (job #2466835)
#include <iostream>
#include<fstream>
#include<string>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie
{
int nr_cuv_final;
int nr_cuv_fii;
trie* fii[27];
trie()
{
for (int i = 0; i <= 26; i++)
fii[i] = 0;
nr_cuv_final = 0;
nr_cuv_fii = 0;
}
};
trie* root = new trie;
void add(string& s)
{
int numeric, i, size_s;
size_s = s.size();
trie* act = root;
for (i = 0; i < size_s; i++)
{
numeric = s[i] - 97;
act->nr_cuv_fii++;
if (act->fii[numeric] == NULL) act->fii[numeric] = new trie;
act = act->fii[numeric];
}
act->nr_cuv_fii++;
act->nr_cuv_final++;
}
void del(string& s)
{
int numeric, i, size_s;
size_s = s.size();
trie* act = root;
for (i = 0; i < size_s; i++)
{
numeric = s[i] - 97;
act->nr_cuv_fii--;
act = act->fii[numeric];
}
i--;
act->nr_cuv_fii--;
act->nr_cuv_final--;
}
void find(string& s)
{
int numeric, i, size_s;
size_s = s.size();
trie* act = root;
for (i = 0; i < size_s; i++)
{
numeric = s[i] - 97;
if (act->fii[numeric] == NULL)
{
g << 0 << "\n";
return;
}
act = act->fii[numeric];
}
g << act->nr_cuv_final << "\n";
}
void prefix(string& s)
{
int numeric, i, size_s;
size_s = s.size();
trie* act = root;
for (i = 0; i < size_s; i++)
{
numeric = s[i] - 97;
if (act->fii[numeric] == NULL)
{
g << i << "\n";
return;
}
if (act->fii[numeric]->nr_cuv_fii == 0)
{
g << i << "\n";
return;
}
act = act->fii[numeric];
}
g << size_s << "\n";
}
int main()
{
string s;
int c;
while (f >> c >> s)
{
//cout << s.size();
if (c == 0) add(s);
if (c == 1) del(s);
if (c == 2) find(s);
if (c == 3) prefix(s);
}
return 0;
}