Pagini recente » Cod sursa (job #1663358) | Cod sursa (job #1546808) | Cod sursa (job #894078) | Cod sursa (job #670751) | Cod sursa (job #1640712)
#include <fstream>
#include <cstring>
#define NMAX 1000
using namespace std;
char s[50];
int t;
struct trie
{
int nr1,nr2;
trie *nod[30];
trie()
{
nr1=0;nr2=0;
memset(nod,0,sizeof(nod));
}
}*root;
void add(trie *rad,char *s)
{
if(*s == 0)
{
rad->nr1++;
return;
}
if(rad->nod[*s-'a'] == NULL)
{
rad->nod[*s-'a']=new trie();
rad->nr2++;
}
add(rad->nod[*s-'a'],s+1);
}
bool sterge(trie *&rad, char *s)
{
if(*s == 0)
{
rad->nr1--;
if(rad->nr1 == 0 && rad->nr2 == 0 && rad!=root)
{
rad=NULL;
return 1;
}
return 0;
}
if(sterge(rad->nod[*s-'a'],s+1))
{
rad->nr2--;
if(rad->nr2 == 0 && rad->nr1 == 0 && rad!=root)
{
rad=NULL;
return 1;
}
return 0;
}
}
int apar(trie *rad,char *s)
{
if(*s == 0)
{
return rad->nr1;
}
if(rad->nod[*s-'a'] != NULL) return(apar(rad->nod[*s-'a'],s+1));
else return 0;
}
int aparpref(trie *rad,char *s)
{
if(*s == 0)
{
return 0;
}
if(rad->nod[*s-'a'] != NULL) return 1+aparpref(rad->nod[*s-'a'],s+1);
else return 0;
}
int main()
{
ifstream f("trie.in");
ofstream g("trie.out");
root = new trie;
while(f>>t)
{
f.get();
f.getline(s,NMAX);
if (t == 0)
{
add(root,s);
}
else if (t == 1)
{
sterge(root,s);
}
else if (t == 2)
{
g<<apar(root,s)<<"\n";
}
else
{
g<<aparpref(root,s)<<"\n";
}
}
}