Pagini recente » Cod sursa (job #1262083) | Cod sursa (job #60658) | Cod sursa (job #2751895) | Cod sursa (job #1894167) | Cod sursa (job #2259924)
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Trie
{
int nrfii,cuv;
Trie *urm[30];
Trie()
{
nrfii=0;
cuv=0;
for(int i=0;i<26;i++)
{
urm[i]=NULL;
}
}
};
Trie *Root;
int pozitie(char x)
{
return x-'a';
}
void adaugare_cuvant(char *s)
{
Trie *nod=Root;
int i,litera;
for(i=0;i<strlen(s);i++)
{
litera=pozitie(s[i]);
if(nod->urm[litera]==NULL)
{
nod->urm[litera]=new Trie();
}
nod->nrfii++;
nod=nod->urm[litera];
}
nod->cuv++;
}
int nr_aparitii_cuvant(char *s)
{
Trie *nod=Root;
int i,litera;
for(i=0;i<strlen(s);i++)
{
litera=pozitie(s[i]);
if(nod->urm[litera]==NULL)
{
return 0;
}
nod=nod->urm[litera];
}
return nod->cuv;
}
int cel_mai_lung_prefix(char *s)
{
Trie *nod=Root;
int i,litera,lg=0;
for(i=0;i<strlen(s);i++)
{
litera=pozitie(s[i]);
if(nod->urm[litera]==NULL)
{
return lg;
}
nod=nod->urm[litera];
lg++;
}
return lg;
}
int stergere_cuvant( Trie *nod, char *s ) {
if( *s == NULL)
nod->cuv --;
else if( stergere_cuvant( nod->urm[ pozitie(*s) ], s+1 ) ) {
nod->urm[ pozitie(*s) ] = 0;
nod->nrfii --;
}
if( nod->cuv == 0 && nod->nrfii == 0 && nod != Root ) {
delete nod; return 1;
}
return 0;
}
int main()
{
int op;
char s[30];
Root=new Trie();
while(f>>op)
{
f>>s;
if(op==0)
adaugare_cuvant(s);
if(op==1)
stergere_cuvant(Root,s);
if(op==2)
g<<nr_aparitii_cuvant(s)<<"\n";
if(op==3)
g<<cel_mai_lung_prefix(s)<<"\n";
}
return 0;
}