Pagini recente » Cod sursa (job #2480011) | Cod sursa (job #1146520) | Cod sursa (job #1194511) | Cod sursa (job #1444526) | Cod sursa (job #2202486)
#include <fstream>
using namespace std;
ifstream fin ("trie.in");
ofstream fout("trie.out");
int n,tip;
char sir[100];
struct noduri
{
int ap, ok;
noduri *v[26];
noduri()
{
for(int i = 0; i < 26; ++ i)
v[i] = NULL;
ap = ok = 0;
}
} *root;
void adauga(noduri *&nod, char *sir)
{
if(*sir == 0)
{
++ nod->ap;
return;
}
if(nod->v[*sir - 'a'] == NULL)
{
nod->v[*sir - 'a'] = new noduri;
++ nod->ok;
}
adauga(nod->v[*sir - 'a'], sir + 1);
}
void sterge(noduri *&nod, char *sir)
{
if(*sir == 0)
{
-- nod->ap;
if(nod->ap == 0 && nod->ok == 0 && nod != root)
{
delete nod;
nod = NULL;
}
return;
}
sterge(nod->v[*sir - 'a'], sir + 1);
if(nod->v[*sir - 'a'] == NULL)
{
-- nod->ok;
if(nod->ap == 0 && nod->ok == 0 && nod != root)
{
delete nod;
nod = NULL;
}
}
}
int nr_cuvinte(noduri *nod, char *sir)
{
if(*sir == 0)
{
return nod->ap;
}
if(nod->v[*sir - 'a'] == NULL)
return 0;
return nr_cuvinte(nod->v[*sir - 'a'], sir + 1);
}
int max_seq(noduri *nod, char *sir)
{
if(*sir == 0)
return 0;
if(nod-> ok < 2)
return 0;
return 1 + max_seq(nod->v[*sir - 'a'], sir + 1);
}
int main()
{
root = new noduri;
while(fin>>tip)
{
fin>>sir;
if(tip==0)
adauga(root,sir);
else if(tip==1)
sterge(root,sir);
else if(tip==2)
fout<<nr_cuvinte(root,sir)<<"\n";
else
fout<<max_seq(root,sir)<<"\n";
}
return 0;
}