Pagini recente » Cod sursa (job #1362131) | Cod sursa (job #1716004) | Cod sursa (job #2888040) | Cod sursa (job #902784) | Cod sursa (job #1640676)
#include <fstream>
#include <cstring>
#define NMAX 1000
using namespace std;
char s[50];
int t;
struct trie
{
int nr1,nr2;
trie *nod[27];
trie()
{
nr1=0;nr2=0;
memset(nod,0,sizeof(nod));
}
}*root;
void add(trie *rad,int poz)
{
int p;
if(s[poz] == '\0')
{
rad->nr1++;
return;
}
if(rad->nod[s[poz]-'a'] == NULL)
{
rad->nod[s[poz]-'a']=new trie();
rad->nr2++;
}
p=poz+1;
add(rad->nod[s[poz]-'a'],p);
}
bool sterge(trie *rad, int poz)
{
if(s[poz] == '\0')
{
rad->nr1--;
if(rad->nr1 == 0 && rad->nr2 == 0 && rad!=root)
{
rad=NULL;
return 1;
}
return 0;
}
int p=poz+1;
if(sterge(rad->nod[s[poz]-'a'],p))
{
rad->nr2--;
if(rad->nr2 == 0 && rad->nr1 == 0 && rad!=root)
{
rad=NULL;
return 1;
}
return 0;
}
}
int apar(trie *rad,int poz)
{
if(s[poz] == '\0')
{
return rad->nr1;
}
int p=poz+1;
if(rad->nod[s[poz]-'a'] != NULL) return(apar(rad->nod[s[poz]-'a'],p));
else return 0;
}
int aparpref(trie *rad,int poz)
{
if(s[poz] == '\0')
{
return 0;
}
int p=poz+1;
if(rad->nod[s[poz]-'a'] != NULL) return 1+aparpref(rad->nod[s[poz]-'a'],p);
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,0);
}
else if (t == 1)
{
sterge(root,0);
}
else if (t == 2)
{
g<<apar(root,0)<<"\n";
}
else
{
g<<aparpref(root,0)<<"\n";
}
}
}