Pagini recente » Cod sursa (job #3128531) | Cod sursa (job #2290485) | Cod sursa (job #1228419) | Cod sursa (job #1867831) | Cod sursa (job #876330)
Cod sursa(job #876330)
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
FILE*in=fopen("trie.in","r");
FILE*out=fopen("trie.out","w");
int tip,lungime;
struct trie
{
int sons;
int apearance;
trie *son[26];
trie()
{
sons=0;
apearance=0;
memset(son,0,sizeof(son));
}
};
trie *radacina = new trie;
void adauga(trie *node,char *word);
bool scoate(trie *node,char *word);
int aparitie(trie *node,char *word);
int prefix(trie *node,char *word,int length);
char cuvant[21];
int main()
{
while(!feof(in))
{
fscanf(in,"%d %s ",&tip,cuvant);
if(tip==0)
adauga(radacina,cuvant);
else
if(tip==1)
scoate(radacina,cuvant);
else
if(tip==2)
fprintf(out,"%d\n",aparitie(radacina,cuvant));
else
fprintf(out,"%d\n",prefix(radacina,cuvant,lungime));
}
fclose(in);
fclose(out);
}
void adauga(trie *node,char *word)
{
if(!*word)
++node->apearance;
else
{
if(!node->son[*word-'a'])
{
++node->sons;
node->son[*word-'a'] = new trie;
}
adauga(node->son[*word-'a'],word+1);
}
}
bool scoate(trie *node,char *word)
{
if(!*word)
--node->apearance; // pt ca e MULT mai eficient
else
{
if(scoate(node->son[*word-'a'],word+1))
{
--node->sons;
node->son[*word-'a']=0;
}
}
if(node->sons || node==radacina || node->apearance)
return false;
delete node;
return true;
}
int aparitie(trie *node,char *word)
{
if(!*word)
return node->apearance;
if(node->son[*word-'a'])
return aparitie(node->son[*word-'a'],word+1);
return 0;
}
int prefix(trie *node,char *word,int length)
{
if(!node->son[*word-'a'] || !*word)
return length;
return prefix(node->son[*word-'a'],word+1,length+1);
}