Pagini recente » Cod sursa (job #3236789) | Cod sursa (job #1914316) | Cod sursa (job #2419721) | Cod sursa (job #464367) | Cod sursa (job #2628937)
//#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
struct adat
{
int sz,veg;
adat* kov[27];
};
adat* start;
string k;
void betesz (adat*&s, string k)
{
int p,i;
p=int(k[0]-'a');
if(s==NULL)
{
s=new adat;
s->sz=0;
s->veg=0;
for(i=0;i<=26;++i) s->kov[i]=NULL;
if(k.length()==0) s->veg++;
else
{
s->sz++;
betesz(s->kov[p],k.substr(1,k.length()));
}
}
else
{
if(k.length()==0) s->veg++;
else
{
s->sz++;
betesz(s->kov[p],k.substr(1,k.length()));
}
}
}
int torol (adat*&s,string k)
{
int p=k[0]-'a',i;
if(s!=NULL)
{
s->sz--;
if(s->sz==0)
{
for(i=0;i<=26;++i)
{
delete s->kov[i];
s->kov[i]=NULL;
}
}
else
if(k.length()==0)
{
s->veg--;
if(s->veg==0)
{
delete s;
s=NULL;
}
}
else torol(s->kov[p],k.substr(1,k.length()));
}
}
/*
int kiir (adat*&s)
{
adat*p=s;
while (p)
{
cout<<p->x<<" ";
p=p->kov;
}
}*/
int szo(adat*s,string k)
{
if(k.length()==0) return s->veg;
else return szo(s->kov[k[0]-'a'],k.substr(1,k.length()));
}
int prefix(adat*s,string k)
{
int p=k[0]-'a';
if(s->kov[p]==NULL) return 0;
else return 1+prefix(s->kov[k[0]-'a'],k.substr(1,k.length()));
}
long long i,n,a;
int main()
{
int db=0;
start=NULL;
while (cin>>a>>k)
{
if(a==0) betesz(start,k);
if(a==1) torol(start,k);
if(a==2)
cout<<szo(start,k)<<"\n";
if(a==3) cout<<prefix(start,k)<<"\n";
}
//torolel(start);
//kiir(start);
return 0;
}