Pagini recente » Monitorul de evaluare | Cod sursa (job #2037568) | Cod sursa (job #1208459) | Cod sursa (job #1597934) | Cod sursa (job #928818)
Cod sursa(job #928818)
#include<fstream>
#include<cstring>
#include<vector>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int lg,size=1;
char sir[25];
struct nod {
int v[30],wd,pfx;
void init ()
{
wd=0, pfx=0;
memset(v,0,sizeof(v));
}
} blank;
vector<nod> T;
void add (int nod, int crt)
{
T[nod].pfx++;
if (crt==lg)
T[nod].wd++;
else
{
int& next_nod=T[nod].v[sir[crt]-'a'];
if (!next_nod)
next_nod=size, T.push_back(blank), size++;
add(next_nod,crt+1);
}
}
void erase (int nod, int crt)
{
T[nod].pfx--;
if (crt==lg)
T[nod].wd--;
else
erase(T[nod].v[sir[crt]-'a'],crt+1);
}
int query_words (int nod, int crt)
{
if (crt==lg)
return T[nod].wd;
else
{
int next_nod=T[nod].v[sir[crt]-'a'];
if (!next_nod)
return 0;
return query_words(next_nod,crt+1);
}
}
int query_lcp (int nod, int crt)
{
if (crt==lg)
return crt;
else
{
int next_nod=T[nod].v[sir[crt]-'a'];
if (!next_nod || !T[next_nod].pfx)
return crt;
return query_lcp(next_nod,crt+1);
}
}
int main ()
{
int tip;
T.push_back(blank);
T.push_back(blank);
f>>tip;
f.get();
f.get(sir,25);
while (!f.eof())
{
lg=strlen(sir);
if (tip==0)
add(1,0);
if (tip==1)
erase(1,0);
if (tip==2)
g<<query_words(1,0)<<"\n";
if (tip==3)
g<<query_lcp(1,0)<<"\n";
f>>tip;
f.get();
f.get(sir,25);
}
return 0;
}