Pagini recente » Cod sursa (job #2388064) | Cod sursa (job #2366091) | Cod sursa (job #1002087) | Cod sursa (job #519938) | Cod sursa (job #2053540)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct TRIE
{
TRIE *fiu[26];
int terminal, nrf;
TRIE()
{
nrf = 0; terminal = 0;
for(int i = 0; i <= 25; ++i)
fiu[i] = 0;
}
};
TRIE *T = new TRIE;
int v, maxim;
char cuv[25];
void adauga(TRIE *nod, char *p)
{
int x = *p - 'a';
if(*p == '\0')
{
nod->terminal ++;
return ;
}
else if(nod->fiu[x] == 0)
{
nod->nrf++;
nod->fiu[x] = new TRIE;
}
adauga(nod->fiu[x], p + 1);
}
bool sterge(TRIE *nod, char *p)
{
int x = *p - 'a';
if(*p == '\0')nod->terminal--;
else if(sterge(nod->fiu[x], p + 1))
{
nod->fiu[x] = 0;
nod->nrf --;
}
if(nod->terminal == 0 && nod->nrf == 0 && nod != T)
{
delete(nod);
return 1;
}
return 0;
}
int verif(TRIE *nod, char *p)
{
int x = *p - 'a';
if(*p =='\0')return nod->terminal;
else if(nod -> fiu[x])return verif(nod->fiu[x], p + 1);
return 0;
}
int prefmax(TRIE *nod, char *p)
{
int x= *p - 'a';
if(*p == '\0')return 0;
if(!nod -> fiu[x])return 0;
return 1 + prefmax(nod ->fiu[x], p + 1);
}
int main()
{
while(fin >> v)
{
fin >> cuv;
if(v == 0)adauga(T, cuv);
else if(v == 1)sterge(T, cuv);
else if(v == 2)fout << verif(T, cuv) << '\n';
else fout << prefmax(T, cuv) << '\n';
}
return 0;
}