Pagini recente » Istoria paginii runda/contest_7/clasament | Cod sursa (job #2189945) | Cod sursa (job #2915957) | Cod sursa (job #798764) | Cod sursa (job #1958840)
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
ofstream g("trie.out");
struct nod
{
int aparitii, final_cuv;
nod *fii[26];
};
void ins(nod *n, string s)
{
++n->aparitii;
for(int i=0; i<s.size(); ++i)
{
if(!n->fii[s[i]-'a'])
n->fii[s[i]-'a'] = new nod();
n = n->fii[s[i]-'a'];
++n->aparitii;
}
++n->final_cuv;
}
void del(nod *n, string s)
{
--n->aparitii;
for(int i=0; i<s.size(); ++i)
{
n = n->fii[s[i]-'a'];
--n->aparitii;
}
--n->final_cuv;
}
int out(nod *n, string s)
{
for(int i=0; i<s.size(); ++i)
if(!n->fii[s[i]-'a']) return 0;
else
n = n->fii[s[i]-'a'];
return n->final_cuv;
}
int pre(nod *n, string s)
{
int lung_pref=0;
for( ;lung_pref < s.size() && n->fii[s[lung_pref]-'a'] && n->fii[s[lung_pref]-'a']->aparitii ; )
n = n->fii[s[lung_pref++]-'a'];
return lung_pref;
}
void read()
{
ifstream f("trie.in");
int cod; string s;
nod *rad = new nod();
while(f >> cod)
{
f >> s;
if(cod == 0) ins(rad, s);
if(cod == 1) del(rad, s);
if(cod == 2) g << out(rad, s) << '\n';
if(cod == 3) g << pre(rad, s) << '\n';
}
f.close();
}
int main()
{
read();
return 0;
}