Pagini recente » Cod sursa (job #1294324) | Cod sursa (job #2225495) | Cod sursa (job #2437524) | Cod sursa (job #1587629) | Cod sursa (job #1472543)
#include <iostream>
#include <stack>
#include <fstream>
#include <cstring>
#define alphabet 28
using namespace std;
fstream f,g;
char cuv[26];
struct trie
{
int cuvinte, nrFii;
trie *urm[alphabet];
trie ()
{
nrFii = 0 ;
cuvinte = 0;
int i;
for(i = 0 ; i < alphabet ; i++)
urm[i] = NULL;
}
bool operator = ( trie *a)
{
cuvinte = a->cuvinte;
nrFii = a->nrFii;
int i;
for(i = 0 ; i < alphabet ; i++)
urm[i] = a->urm[i];
return 1;
}
};
trie *rad;
void adauga()
{
unsigned int i;
trie *p,*q;
p = rad;
for (i = 0 ; i< strlen(cuv); i++)
{
if ( p-> urm[cuv[i]-'a'] == NULL) // fac fiu nou
{
p->nrFii++;
p->urm[cuv[i]-'a'] = new trie();
}
p = p->urm[cuv[i]-'a'];
}
p->cuvinte++;
}
void sterge ()
{
int indice = 0;
trie *p = rad->urm[cuv[indice++]-'a'];
stack <trie*> s;
s.push(rad);
s.push(p);
while(indice < strlen(cuv))
{
p = p->urm[cuv[indice++]-'a'];
s.push(p);
}
p = s.top();
p->cuvinte--;
while(!s.empty())
{
p = s.top();
s.pop();
indice--;
if (p == rad) break;
if (p->cuvinte == 0 && p->nrFii == 0)
{
delete p;
s.top() -> urm[cuv[indice]-'a'] = NULL;
s.top()->nrFii--;
}
}
}
int apariti()
{
unsigned int i;
trie *p=rad;
for (i = 0 ; i < strlen(cuv) ; i++)
{
if (p->urm[cuv[i]-'a'] == NULL)
return 0;
p = p -> urm[cuv[i]-'a'];
}
return p -> cuvinte;
}
int prefix()
{
int sol = 0;
int i;
trie *p=rad;
for (i = 0 ; i < strlen(cuv) ; i++)
{
if (p->urm[cuv[i]-'a'] == NULL)
return sol;
p = p -> urm[cuv[i]-'a'];
sol++;
}
return sol;
}
int main()
{
int op;
f.open("trie.in",ios::in);
g.open("trie.out",ios::out);
rad = new trie();
while( f>>op>>cuv)
{
if (op == 0)
adauga();
else if (op == 1 )
sterge();
else if (op == 2 )
g<<apariti()<<'\n';
else if (op == 3 )
g<<prefix()<<'\n';
}
return 0;
}