Pagini recente » Cod sursa (job #1092034) | Cod sursa (job #565412) | Cod sursa (job #689047) | Cod sursa (job #1873330) | Cod sursa (job #331067)
Cod sursa(job #331067)
#include<string>
#include<vector>
#include<fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
string word;
string ::iterator it;
class Trie
{
inline int CHR(char c)
{
return c-'a';
}
struct trie
{
int nrCuv,nrFii;
trie *Fii[26];
trie()
{
nrCuv=nrFii=0;
memset(Fii,0,sizeof(Fii));
}
};
trie rad;
public:
void add(string word)
{
trie *End=&rad;
End->nrCuv++;
for(it=word.begin();it!=word.end();it++)
{
if(End->Fii[CHR(*it)]==0)
End->Fii[CHR(*it)]=new trie;
End=End->Fii[CHR(*it)];
End->nrCuv++;
}
End->nrFii++;
}
void Delete(string word)
{
trie *End=&rad,*Prev;
End->nrCuv--;
for(int i=0;i<word.length();i++)
{
Prev=End;
End=End->Fii[CHR(word[i])];
End->nrCuv--;
if(End->nrCuv==0)
{
Prev->Fii[CHR(word[i])]=0;
delete End;
for(i++;i<word.length();i++)
{
trie *aux=End;
End=End->Fii[CHR(word[i])];
delete aux;
}
}
}
if(End)
End->nrFii--;
}
int GetNr(string word)
{
trie *End=&rad;
for(it=word.begin();it!=word.end();it++)
End=End->Fii[CHR(*it)];
return End->nrFii;
}
int GetPref(string word)
{
trie *End=&rad;
for(it=word.begin();it!=word.end();it++)
{
if(End->Fii[CHR(*it)]==0)
break;
End=End->Fii[CHR(*it)];
}
return it-word.begin();
}
};
int main()
{
int op;
Trie TRIE;
while(f>>op)
{
f>>word;
switch(op)
{
case 0:
TRIE.add(word);break;
case 1:
TRIE.Delete(word);break;
case 2:
g<<TRIE.GetNr(word)<<'\n';break;
case 3:
g<<TRIE.GetPref(word)<<'\n';break;
}
}
return 0;
}