Pagini recente » Cod sursa (job #287195) | Cod sursa (job #28017) | Cod sursa (job #821976) | Cod sursa (job #468994) | Cod sursa (job #2259862)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Trie
{
int nr;
Trie *urm[27];
Trie()
{
nr=0;
for(int i=0;i<26;i++)
{
urm[i]=NULL;
}
}
};
Trie *Root;
int pozitie(char x)
{
return x-'a';
}
void adaugare_cuvant(string s)
{
Trie *nod=Root;
int i,litera;
nod->nr++;
for(i=0;i<int(s.size());i++)
{
litera=pozitie(s[i]);
if(nod->urm[litera]==NULL)
{
nod->urm[litera]=new Trie();
}
nod=nod->urm[litera];
nod->nr++;
}
}
int nr_aparitii_cuvant(string s)
{
Trie *nod=Root;
int i,litera;
for(i=0;i<int(s.size());i++)
{
litera=pozitie(s[i]);
if(nod->urm[litera]==NULL)
{
return 0;
}
nod=nod->urm[litera];
}
int inplus=0;
for(i=0;i<26;i++)
{
if(nod->urm[i]!=NULL)
{
inplus=inplus+nod->urm[i]->nr;
}
}
return nod->nr-inplus;
}
int cel_mai_lung_prefix(string s)
{
Trie *nod=Root;
int i=0,lg=0,litera;
for(i=0;i<int(s.size());i++)
{
litera=pozitie(s[i]);
if(nod->urm[litera]==NULL || nod->urm[litera]->nr==0)
{
return lg;
}
lg++;
nod=nod->urm[litera];
}
return lg;
}
void stergere_cuvant(string s)
{
Trie *nod=Root;
int i,litera;
nod->nr--;
for(i=0;i<int(s.size());i++)
{
litera=pozitie(s[i]);
nod=nod->urm[litera];
nod->nr--;
}
}
int main()
{
string s;
int op;
Root=new Trie();
while(f>>op)
{
f>>s;
if(op==0)
adaugare_cuvant(s);
if(op==1)
stergere_cuvant(s);
if(op==2)
g<<nr_aparitii_cuvant(s)<<"\n";
if(op==3)
g<<cel_mai_lung_prefix(s)<<"\n";
}
return 0;
}