Pagini recente » Cod sursa (job #2418440) | Cod sursa (job #1885259) | Cod sursa (job #1260323) | Cod sursa (job #896069) | Cod sursa (job #2022972)
#include <fstream>
#include <string>
using namespace std;
ifstream fi("trie.in");
ofstream fo("trie.out");
struct trie
{
trie *f[26];
int nrf;
int cuv;
trie()
{
cuv=0;
nrf=0;
for(int i=0;i<=25;i++)
f[i]=NULL;
}
};
string s;
void adauga(trie *&p,int poz)
{
if(p==NULL)
p=new trie();
if(poz==s.size())
p->cuv++;
else
{
p->nrf++;
adauga(p->f[s[poz]-97],poz+1);
}
}
void sterge(trie *&p,int poz)
{
if(poz!=s.size())
{
p->nrf--;
sterge(p->f[s[poz]-97],poz+1);
}
else
p->cuv--;
if(p->cuv+p->nrf==0)
delete p,p=NULL;
}
int afisapar(trie *&p, int poz)
{
if(p==NULL)
return 0;
if(poz==s.size())
return p->cuv;
else
return afisapar(p->f[s[poz]-97],poz+1);
}
int lungpref(trie *&p,int poz)
{
if(poz==s.size())
return poz;
if(p->f[s[poz]-97]!=NULL &&
p->f[s[poz]-97]->cuv+p->f[s[poz]-97]->nrf!=0)
return lungpref(p->f[s[poz]-97],poz+1);
else
return poz;
}
int x;
trie *T=new trie();
int main()
{
while(fi>>x)
{
fi>>s;
if(x==0)
adauga(T,0);
if(x==1)
sterge(T,0);
if(x==2)
fo<<afisapar(T,0)<<'\n';
if(x==3)
fo<<lungpref(T,0)<<'\n';
}
return 0;
}