Pagini recente » Cod sursa (job #88421) | Cod sursa (job #581659) | Cod sursa (job #18279) | Istoria paginii runda/22_februarie_simulare_oji_2024_clasa_10/clasament | Cod sursa (job #1934148)
#include <iostream>
#include<fstream>
#include<cstring>
using namespace std;
struct nod
{
int info,nrfii;
nod *fii[26];
} *rad;
int t;
char s[21];
ifstream f("trie.in");
ofstream g("trie.out");
void adauga(char s[21],nod *r)
{
int l=strlen(s);
for(int i=0; i<l; i++)
{
nod *p=r->fii[s[i]-'a'];
if(!p)
{
nod* q=new nod;
r->fii[s[i]-'a']=q;
q->info=0;
q->nrfii=0;
r->nrfii++;
}
r=p;
}
r->info++;
}
int sterge(char s[21],nod *r)
{
if(!s) r->info--;
if(sterge(s+1,r->fii[s[0]-'a'])){r->nrfii--;r->fii[s[0]-'a']=0;}
if(!r->info && !r->nrfii && r!=rad) {delete r; return 1;}
return 0;
}
void aparitii(char s[26],nod*r)
{
int l=strlen(s);
for(int i=0; i<l; i++)
r=r->fii[s[i]-'a'];
g<<r->info<<endl;
}
void prefix(char s[26], nod* r)
{
int l=strlen(s),i;
for(i=0; i<l; i++)
if(r->fii[s[i]-'a'])
r=r->fii[s[i]-'a'];
else break;
g<<i+1<<endl;
}
int main()
{
rad=new nod;
rad->info=0;
rad->nrfii=0;
while(f>>t)
{
f>>s;
if(t==0) adauga(s,rad);
else if(t==1) sterge(s,rad);
else if(t==2) aparitii(s,rad);
else prefix(s,rad);
}
return 0;
}