Pagini recente » Cod sursa (job #2658631) | Cod sursa (job #930396) | Cod sursa (job #424588) | Cod sursa (job #1621298) | Cod sursa (job #2052090)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
typedef struct nod{struct nod *fiu[28]; int terminal;} NOD, *TRIE;
TRIE T = NULL;
int v, maxim;
char cuv[25], *p1;
void adauga(TRIE &T, char *p)
{
if(T == 0)
{
T = new NOD;
for(int i = 0; i <= 25; ++i)T->fiu[i] = 0;
T->terminal = 0;
adauga(T, p);
}
else if(*p == '\0')T->terminal ++;
else adauga(T->fiu[*p - 'a'], p + 1);
}
void sterge(TRIE &T, char *p)
{
if(*(p + 1) == '\0')
{
T->fiu[*p - 'a'] = 0;
T->terminal--;
}
else sterge(T->fiu[*p - 'a'], p + 1);
bool ok = 1;
for(int i = 0; i <= 25; ++i)
if(T->fiu[i] != 0)ok = 0;
if(ok == 1)
{
T = 0;
T ->terminal = 0;
delete(T);
}
}
int verif(TRIE &T, char *p)
{
if(*p == '\0')return T->terminal;
return verif(T->fiu[*p - 'a'], p + 1);
}
int prefmax(TRIE &T, char *p)
{
if(T->terminal!= 0 && *(p + 1)!='\0')maxim = max(maxim, p - p1);
if(T ->terminal > 1 && *(p + 1)== '\0')maxim = max(maxim, p - p1);
for(int i = 0; i <= 25; ++i)
if(T->fiu[i]!= 0 && (i != *p - 'a'))
maxim = max(maxim, p - p1);
if(*p != '\0' && T->fiu[*p - 'a'] != 0)maxim = max(maxim,prefmax(T->fiu[*p - 'a'], p + 1));
return maxim;
}
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
{
p1 = cuv;
maxim = 0;
fout << prefmax(T, cuv) << '\n';
}
}
return 0;
}