Pagini recente » Cod sursa (job #1722538) | Cod sursa (job #132662) | Cod sursa (job #605873) | Cod sursa (job #2184670) | Cod sursa (job #730235)
Cod sursa(job #730235)
#include<cstdio>
#include<cstring>
using namespace std;
const int Nmax=26; // nr de litere ale alfabetului folosit
char s[21]; // cuvantul citit din fisier
typedef struct trie {
int fii,nrCuvinte;
trie* fiu[Nmax];
trie()
{
fii=nrCuvinte=0;
memset(fiu,NULL,sizeof(fiu));
}
}TRIE;
TRIE* w;
void insert_word(TRIE* word,int letter)
{
if(s[letter]==NULL)
{
word->nrCuvinte++;
return;
}
if(word->fiu[ s[letter]-'a' ]==NULL)
{
word->fiu[ s[letter]-'a' ]=new TRIE;
word->fii++;
}
insert_word(word->fiu[ s[letter]-'a' ],letter+1);
}
bool delete_word(TRIE* word,int letter)
{
if(s[letter]==NULL)
word->nrCuvinte--;
else
if(delete_word(word->fiu[ s[letter]-'a' ],letter+1)==1)
{
word->fii--;
word->fiu[ s[letter]-'a' ]=NULL;
}
if(word->fii==0 && word->nrCuvinte==0 && word!=w) //daca nodul nu mai are fii si nu avea cuvinte care se termina in el si nu e nici radacina
{
delete word;
return 1;
}
return 0;
}
int NumberOfWords(TRIE* word,int letter)
{
if(s[letter]==NULL)
return word->nrCuvinte;
if(word->fiu[ s[letter]-'a' ] != NULL) // de verificat daca merge fara if si fara return 0;
return NumberOfWords(word->fiu[ s[letter]-'a' ],letter+1);
return 0;
}
int NumberOfPrefixes(TRIE* word,int letter)
{
if(s[letter]==NULL || word->fiu[ s[letter]-'a' ]==NULL)
return letter;
return NumberOfPrefixes(word->fiu[ s[letter]-'a' ],letter+1);
}
int main()
{
int operation;
w=new TRIE; // w este radacina trie-ului
FILE *in,*out;
in=fopen("trie.in","r");
out=fopen("trie.out","w");
while(fscanf(in,"%d %s",&operation,s) != EOF)
{
if(operation==0)
insert_word(w,0);
if(operation==1)
delete_word(w,0);
if(operation==2)
fprintf(out,"%d\n",NumberOfWords(w,0));
if(operation==3)
fprintf(out,"%d\n",NumberOfPrefixes(w,0));
}
fclose(in);
fclose(out);
return 0;
}