Pagini recente » Cod sursa (job #2503171) | Cod sursa (job #1581988) | Cod sursa (job #300169) | Cod sursa (job #2599600) | Cod sursa (job #2041529)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
trie *next[30];
int aparitie;
int treceri;
}*d,*p;
char x[22];
int n,ttl;
void adauga(int poz, int n,int val)
{
if(p->next[x[poz]-'a']==0)
{
trie *s=new trie;
s->aparitie=0;
for(int i=0;i<30;i++)
s->next[i]=0;
p->next[x[poz]-'a']=s;
p=s;
}
else
p=p->next[x[poz]-'a'];
p->treceri+=val;
if(poz<n-1)
adauga(poz+1,n,val);
else
p->aparitie+=val;
}
void afiseaza(int poz,int n)
{
if(p->next[x[poz]-'a']==0)
{
fout<<"0\n";
return;
}
else
p=p->next[x[poz]-'a'];
if(poz<n-1)
afiseaza(poz+1,n);
else
{
fout<<p->aparitie<<"\n";
return;
}
}
void prefix(int poz,int n)
{
if(p->next[x[poz]-'a']==0)
return;
else
p=p->next[x[poz]-'a'];
if(p->treceri>0)
ttl=poz+1;
if(poz<n-1)
prefix(poz+1,n);
else
return;
}
int main()
{
d=new trie;
d->aparitie=0;
for(int i=0;i<30;i++)
d->next[i]=0;
while(fin>>n)
{
fin>>x;
int qwert=strlen(x);
int i=0;
p=d;
if(n==0)
adauga(i,qwert,1);
else
if(n==1)
adauga(i,qwert,-1);
else
if(n==2)
afiseaza(i,qwert);
else
if(n==3)
{
ttl=0;
prefix(i,qwert);
fout<<ttl<<"\n";
}
}
return 0;
}