Pagini recente » Cod sursa (job #571933) | Cod sursa (job #1010509) | Cod sursa (job #78495) | Cod sursa (job #1879435) | Cod sursa (job #3148252)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
struct Trie
{
int numFii;
int ultLit;
int numCuv;
Trie* tata;
Trie* fii[26];
Trie()
{
numFii=0;
numCuv=0;
ultLit=0;
memset(fii, 0, sizeof(fii));
tata=NULL;
}
};
Trie* root = new Trie;
string s;
int main()
{
ifstream cin ("trie.in");
ofstream cout ("trie.out");
int cer;
while (cin>>cer>>s>>ws)
{
if (cer==0)
{
Trie* nod=root;
for (int i=0; i<s.size(); i++)
{
if (nod->fii[s[i]-'a']==NULL)
{
nod->numFii++;
nod->fii[s[i]-'a']=new Trie;
nod->fii[s[i]-'a']->tata=nod;
nod->fii[s[i]-'a']->ultLit=(s[i]-'a');
}
nod=nod->fii[s[i]-'a'];
}
nod->numCuv++;
}
else if (cer==1)
{
Trie* nod = root;
for (int i=0; i<s.size(); i++)
{
nod=nod->fii[s[i]-'a'];
}
nod->numCuv--; ///aaa trebuie sa sterg aparitia
while (nod != root) ///so quirky, pentru ca astea sunt pointers atunci devin egale doar cand ocupa aceeasi pozitie din memorie
{
Trie* urm = nod->tata;
int lit = nod -> ultLit;
if (nod->numFii==0 && nod->numCuv==0)
{
delete(nod);
urm->numFii--;
urm->fii[lit]=NULL;
}
nod = urm;
}
}
else if (cer==2)
{
Trie* nod = root;
for (int i=0; i<s.size(); i++)
{
if (nod->fii[s[i]-'a']==NULL)
{
cout<<0<<'\n';
break;
}
nod = nod->fii[s[i]-'a'];
if(i==s.size()-1)
cout<<nod->numCuv<<'\n';
}
}
else if (cer==3)
{
Trie* nod = root;
for (int i=0; i<s.size(); i++)
{
if (nod->fii[s[i]-'a']==NULL)
{
cout<<i<<'\n';
break;
}
nod=nod->fii[s[i]-'a'];
if (i==s.size()-1)
cout<<i+1<<'\n';
}
}
}
}