Pagini recente » Cod sursa (job #1669797) | Cod sursa (job #3286062) | Cod sursa (job #321000) | Cod sursa (job #895300) | Cod sursa (job #3252008)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
#define dim 26
struct trie
{
int cnt,fii;
trie *v[dim];
trie()
{
cnt=fii=0;
for(int i=0;i<dim;i++)
{
v[i]=NULL;
}
}
};
trie *radacina;
void adauga(trie *nod,string s,int i) ///adauga o aparitie a cuvantului s in lista
{
if(i==s.length())
{
nod->cnt++;
return ;
}
int car=s[i]-'a';
if(nod->v[car]==NULL)
{
nod->v[car]=new trie;
nod->fii++;
}
adauga(nod->v[car],s,i+1);
}
int query(trie *nod,string s,int i) ///tipareste numarul de aparitii ale cuvantului s in lista
{
if(i==s.length())
{
return nod->cnt;
}
int car=s[i]-'a';
if(nod->v[car]!=NULL)
return query(nod->v[car],s,i+1);
else
return 0;
}
int prefix(trie *nod,string s) ///tipareste lungimea celui mai lung prefix comun al lui s cu oricare cuvant din lista
{
int i;
for(i=0;i<s.length() && nod!=NULL;i++)
{
nod=nod->v[s[i]-'a'];
}
if(nod==NULL)
i--;
return i;
}
int sterge(trie *nod,string s,int i) ///tipareste lungimea celui mai lung prefix comun al lui s cu oricare cuvant din lista
{
if(i==s.length())
{
nod->cnt--;
}
else if(sterge(nod->v[s[i]-'a'],s,i+1))
{
nod->fii--;
nod->v[s[i]-'a']=0;
}
if(nod->cnt==0 && nod->fii==0 && nod!=radacina)
{
delete nod;
return 1;
}
return 0;
}
int main()
{
string s;
int op;
radacina=new trie;
while(fin>>op>>s)
{
switch(op)
{
case 0:
adauga(radacina,s,0);
break;
case 1:
sterge(radacina,s,0);
break;
case 2:
fout<<query(radacina,s,0)<<'\n';
break;
case 3:
fout<<prefix(radacina,s)<<'\n';
break;
}
}
return 0;
}