Pagini recente » Cod sursa (job #920177) | Cod sursa (job #709149) | Cod sursa (job #1469326) | Cod sursa (job #908911) | Cod sursa (job #2414681)
// nu e sursa mea
#include <bits/stdc++.h>
using namespace std;
int c;
string cuv;
ifstream in ("trie.in") ;
ofstream out ("trie.out") ;
char aux[25];
struct nod
{
int counter,howmany;
nod *son[26];
nod()
{
counter=0;
howmany=0;
memset(son,0,sizeof(son));
}
};
nod *jmek=new nod;
void add(nod *parent,int pos)
{
if(pos==cuv.size())
{
parent->counter++;
return;
}
if(parent->son[cuv[pos]-'a']==0)
{
parent->son[cuv[pos]-'a']=new nod;
parent->howmany++;
}
add(parent->son[cuv[pos]-'a'],pos+1);
}
bool pop(nod *parent,int pos)
{
if(pos==cuv.size())
parent->counter--;
else
{
if(pop(parent->son[cuv[pos]-'a'],pos+1))
{
parent->son[cuv[pos]-'a']=0;
parent->howmany--;
}
}
if(parent->counter==0 && parent->howmany==0 && parent!=jmek)
{
delete parent;
return 1;
}
return 0;
}
int count_them(nod *parent,int pos)
{
if(pos==cuv.size())
return parent->counter;
if(parent->son[cuv[pos]-'a']==0)
return 0;
return count_them(parent->son[cuv[pos]-'a'],pos+1);
}
int largest_prefix(nod *parent,int pos)
{
if(pos==cuv.size())
return pos;
if(parent->son[cuv[pos]-'a']==0)
return pos;
return largest_prefix(parent->son[cuv[pos]-'a'],pos+1);
}
int main()
{
while(in >> c >> cuv )
{
if(c==0)
{
add(jmek,0);
continue;
}
if(c==1)
{
pop(jmek,0);
continue;
}
if(c==2)
{
out << count_them(jmek,0) << '\n' ;
continue;
}
out << largest_prefix(jmek,0) << '\n' ;
}
return 0;
}