Pagini recente » Cod sursa (job #1592464) | Cod sursa (job #1107121) | Cod sursa (job #66540) | Cod sursa (job #435570) | Cod sursa (job #3243951)
#include <fstream>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
int ch;
string sir;
struct trie
{
int fr;
trie *urm[26];
trie ()
{
fr=0;
for (int i=0; i<26; i++)
urm[i]=NULL;
}
};
trie *p=new trie;
void add (trie *p,string &sir)
{
p->fr++;
for (int i=0; i<sir.size (); i++)
{
int nr=sir[i]-'a';
if (p->urm[nr]==NULL)
p->urm[nr]=new trie;
p=p->urm[nr];
p->fr++;
}
}
void del (trie *p,string &sir)
{
p->fr--;
for (int i=0; i<sir.size (); i++)
{
int nr=sir[i]-'a';
trie *u=p->urm[nr];
u->fr--;
if ((p->fr>0||i==0)&&u->fr==0)
p->urm[nr]=NULL;
if (p->fr==0&&i>0)
delete p;
p=u;
}
if (p->fr==0)
delete p;
}
int ap (trie *p,string &sir)
{
for (int i=0; i<sir.size (); i++)
{
int nr=sir[i]-'a';
if (p->urm[nr]==NULL)
return 0;
p=p->urm[nr];
}
int nr=p->fr;
for (int i=0; i<26; i++)
{
if (p->urm[i]!=NULL)
nr-=p->urm[i]->fr;
}
return nr;
}
int pref (trie *p,string &sir)
{
for (int i=0; i<sir.size (); i++)
{
int nr=sir[i]-'a';
if (p->urm[nr]==NULL)
return i;
p=p->urm[nr];
}
return sir.size ();
}
int main()
{
while (fin>>ch>>sir)
{
if (ch==0)
add (p,sir);
else if (ch==1)
del (p,sir);
else if (ch==2)
fout<<ap (p,sir)<<"\n";
else
fout<<pref (p,sir)<<"\n";
}
return 0;
}