Pagini recente » Cod sursa (job #1061137) | Cod sursa (job #2861202) | Cod sursa (job #1649942) | Cod sursa (job #2908558) | Cod sursa (job #2305246)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fi("trie.in");
ofstream fo("trie.out");
const int sigma=26;
struct Trie {
Trie *fii[sigma];
int frecventa,nrf;
Trie(){
memset(fii,0,sizeof(fii));
frecventa=0;
nrf=0;
}
};
int caz;
Trie *root=new Trie();
string w;
void inserare(Trie *nod,int pos)
{
if(pos!=w.size())
{
if(!(nod->fii[w[pos]-'a']))
{
nod->fii[w[pos]-'a']=new Trie();
nod->nrf++;
}
inserare(nod->fii[w[pos]-'a'],pos+1);
}
else nod->frecventa++;
}
bool stergere(Trie *nod,int pos)
{
if(pos!=w.size())
{
if(stergere(nod->fii[w[pos]-'a'],pos+1))
{
nod->nrf--;
nod->fii[w[pos]-'a']=0;
}
if((nod->nrf)==0 && (nod->frecventa)==0 && nod!=root)
{
delete nod;
return 1;
}
else return 0;
}
else
{
nod->frecventa--;
if((nod->nrf)==0 && (nod->frecventa)==0)
{
delete nod;
return 1;
}
else return 0;
}
}
int comun(Trie *nod,int pos)
{
if(pos!=w.size() && nod->fii[w[pos]-'a'])
return comun(nod->fii[w[pos]-'a'],pos+1);
else return pos;
}
int nrap(Trie *nod,int pos)
{
if(pos==w.size())
return nod->frecventa;
else if(nod->fii[w[pos]-'a'])
return nrap(nod->fii[w[pos]-'a'],pos+1);
else return 0;
}
int main()
{
while(fi>>caz)
{
fi>>w;
if(caz==0)
inserare(root,0);
if(caz==1)
stergere(root,0);
if(caz==2)
fo<<nrap(root,0)<<"\n";
if(caz==3)
fo<<comun(root,0)<<"\n";
}
fi.close();
fo.close();
return 0;
}