Pagini recente » Monitorul de evaluare | Cod sursa (job #556652) | Cod sursa (job #334648) | Cod sursa (job #1719561) | Cod sursa (job #1513648)
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct trie
{
trie *tata;
trie *fiu[26];
int cnt,nrfii;
trie()
{
int i;
cnt = 0;
nrfii = 0;
tata = this;
for(i=0; i<26; ++i) fiu[i] = NULL;
}
};
trie *vf = new trie;
void add(char cuv[])
{
int i,n;
trie *p, *next;
p = vf;
n = strlen(cuv);
for(i=0; i<n; ++i)
{
next = p->fiu[cuv[i] - 'a'];
if(next != NULL) p = next;
else
{
p->fiu[cuv[i]-'a'] = new trie;
p->fiu[cuv[i]-'a']->tata = p;
p->nrfii += 1;
p = p->fiu[cuv[i]-'a'];
}
}
++(p->cnt);
}
int aparitii(char cuv[])
{
int i,n;
trie *p;
p = vf;
n = strlen(cuv);
i=0;
while(i<n && p!=NULL)
{
p = p->fiu[cuv[i] - 'a'];
++i;
}
if(p) return p->cnt;
else return 0;
}
void sterge(char cuv[])
{
int i,n;
trie *p, *up;
p = vf;
n = strlen(cuv);
for(i=0; i<n; ++i)
{
p = p->fiu[cuv[i] - 'a'];
}
--(p->cnt);
//cout<<cuv<<"\n";
i = n-1;
while(p->cnt == 0 && p->nrfii == 0 && p!=vf)
{
up = p->tata;
up -> nrfii -= 1;
delete up->fiu[cuv[i] - 'a'];
up->fiu[cuv[i] - 'a'] = NULL;
p = up;
--i;
//cout<<"Sterg: "<<cuv[i]<<"\n";
//--i;
}
}
int prefix(char cuv[])
{
int i,n,maxim;
trie *p;
p = vf;
maxim = 0;
n = strlen(cuv);
//cout<<"Caut: " <<cuv<<"\n";cout<<"strlen = "<<n<<"\n\n";
i=0;
while(p != NULL)
{
//cout<<"Merg pe ramura: "<<(cuv[i] - 'a')<<"\n";
//maxim = max(maxim, p->cnt);
p = p->fiu[cuv[i] - 'a'];
++i;
}
//cout<<cuv<<"\n"<<i-1<<"\n\n";
return (i-1);
}
int main()
{
char cuv[25];
int opt;
trie *p = new trie;
delete p;
while(in>>opt)
{
in>>cuv;
//cout<<cuv<<"\n";
if(opt == 0) add(cuv);
else if(opt == 1) sterge(cuv);
else if(opt == 2) out<<aparitii(cuv)<<"\n";
else out<<prefix(cuv)<<"\n";
//cout<<cuv<<"\n";
}
return 0;
}