Pagini recente » Cod sursa (job #1840658) | Cod sursa (job #1878563) | Cod sursa (job #2091768) | Cod sursa (job #1900621) | Cod sursa (job #2876095)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("trie.in");
ofstream out ("trie.out");
struct trie {
struct trie *child[28];
int nrend;
int paths;
};
trie *getnode()
{
trie *par = new trie;
par->nrend = 0;
par->paths = 0;
for (int i = 0; i < 26; i++)
{
par->child[i] = 0;
}
return par;
}
void insert(trie *root, string w)
{
trie *curr = root;
for (int i = 0; i < w.size(); i++)
{
int ind = w[i] - 'a';
if (!curr->child[ind])
{
curr->child[ind] = getnode();
}
curr = curr->child[ind];
curr->paths++;
}
curr->nrend++;
}
int src (trie *root, string w)
{
trie *curr = root;
for (int i = 0; i < w.size(); i++)
{
int ind = w[i] - 'a';
if (!curr->child[ind]) return false;
curr = curr->child[ind];
}
return curr->nrend;
}
void erase(trie *root, string w)
{
trie *curr = root;
trie *lastEnd = root;
int ii = 0;
for (int i = 0; i < w.size(); i++)
{
int ind = w[i] - 'a';
if (!curr->child[ind]) {
return;
}
curr = curr->child[ind];
curr->paths--;
}
curr->nrend--;
return;
if (curr->nrend == 0) return;
bool chd = 0;
for (int i = 0; i < 26; i++)
{
if (curr->child[i]) {
chd = 1;
break;
}
}
if (chd == 1){
curr->nrend--;
return;
}
if (ii != 0){
curr->nrend--;
if (curr->nrend == 0){
curr = lastEnd;
curr = curr->child[w[ii+1] - 'a'];
curr = 0;
}
return;
}
curr->nrend--;
// root->child[w[0] - 'a'] = 0;
return;
}
int maxPref(trie* root, string w)
{
trie* curr = root;
int mx = 0;
for (int i = 0; i < w.size(); i++)
{
int ind = w[i] - 'a';
if (!curr->child[ind]){
if (curr->paths > 0)
return i;
else return mx;
}
curr = curr->child[ind];
if (curr->paths > 0) mx = i + 1;
else return mx;
}
return mx;
}
int main ()
{
int op;
string w;
trie* root = getnode();
while (in >> op)
{
if (op == 0)
{
in >> w;
insert(root, w);
}
if (op == 1)
{
in >> w;
erase(root, w);
}
if (op == 2)
{
in >> w;
out << src(root, w) << '\n';
}
if (op == 3)
{
in >> w;
out << maxPref(root, w) << '\n';
}
}
}