Pagini recente » Borderou de evaluare (job #3335661) | Cod sursa (job #71453) | Cod sursa (job #2828016) | Cod sursa (job #2540554) | Cod sursa (job #3340409)
#include <fstream>
#include <string>
#include <vector>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
int cer, number_of_words;
string s;
struct nodes
{
int frec[26] = {};
int cnt = 0; //nu stiu ce face inca
int nr = 0;
}k;
vector<nodes> v;
void add(int node, int i)
{
nodes debug = v[node];
if (i == s.size())
{
v[node].cnt++;
v[node].nr++;
return;
}
if (v[node].frec[s[i]-'a'] == 0)
{
v[node].frec[s[i]-'a'] = v.size();
v.push_back(k);
add(v.size()-1, i+1);
v[node].nr++;
return;
}
add(v[node].frec[s[i]-'a'], i+1);
v[node].nr++;
}
void rem(int node, int i)
{
nodes debug = v[node]; ///nu sterge tot
if (i == s.size())
{
v[node].cnt--;
v[node].nr--;
return;
}
//out << s[i] << ' ' << v[node].frec[s[i]-'a'] << '\n';
if (v[node].frec[s[i]-'a'] == 0)
return; ///nu exista cuvantul
rem(v[node].frec[s[i]-'a'], i+1);
v[node].nr--;
if (v[v[node].frec[s[i]-'a']].nr == 0) //nu mai are cuvinte, rupem muchia
{
int maybethis = v[node].frec[s[i]-'a'];
v[node].frec[s[i]-'a'] = 0;
//v.erase(v.begin() + v[node].frec[s[i]-'a']);
}
}
int cauta(int node, int i)
{
nodes debug = v[node];
if (i == s.size())
return v[node].cnt; ///aaaaaaa
if (v[node].frec[s[i]-'a'] == 0)
return 0; ///nu exista cuvantul
return cauta(v[node].frec[s[i]-'a'], i+1);
}
int cauta_prefix_max(int node, int i)
{
nodes debug = v[node];
if (i == s.size())
return i;
if (v[node].frec[s[i]-'a'] == 0)//nu mai avem ce cauta
return i;
int val = cauta_prefix_max(v[node].frec[s[i]-'a'], i+1);
return val;
}
int main()
{
v.push_back(k);
while(in >> cer)
{
in.get();
getline(in, s);
if (cer == 0)
{
number_of_words++;
add(0, 0);
}
else if (cer == 1)
{
rem(0, 0);
number_of_words--;
}
else if (cer == 2)
out << cauta(0, 0) << '\n';
else
out << cauta_prefix_max(0, 0) << '\n';
}
return 0;
}