Pagini recente » Cod sursa (job #291035) | Cod sursa (job #910428) | Cod sursa (job #232424) | Cod sursa (job #424007) | Cod sursa (job #1742725)
#include<cstdio>
#include<cstring>
#define Maxim(x, y) (x >= y ? x : y)
using namespace std;
FILE *fin = freopen("trie.in", "r", stdin);
FILE *fout = freopen("trie.out", "w", stdout);
int P;
char S[30];
struct node
{
int nr = 0;
node *n[30];
node()
{
memset(n, 0, sizeof(n));
}
};
node *start = NULL, *p;
int N;
void Update(node *&p, int i)
{
if (p == NULL) p = new node;
if (i == N)
{
p -> nr++;
return;
}
Update(p -> n[S[i] - 'a'], i + 1);
}
bool Delete(node *&p, int i)
{
if (i == N)
{
p -> nr--;
if (p -> nr == 0)
{
bool ok = 0;
for (int j = 0; j < 26; j++)
ok = ok | (p -> n[j] != NULL);
if (!ok) p = NULL, delete(p);
return ok;
}
return 1;
}
else
{
if (!Delete(p -> n[S[i] - 'a'], i + 1))
{
if (p -> nr) return 1;
bool ok = 0;
for (int i = 0; i < 26; i++)
ok = ok | (p -> n[i] != NULL);
if (!ok) p = NULL, delete(p);
return ok;
}
return 1;
}
}
int Nr(int i, node *p)
{
if (p == NULL) return 0;
if (i == N) return p -> nr;
return Nr(i + 1, p -> n[S[i] - 'a']);
}
int Prefix(int i, node *p)
{
if (p == NULL) return Maxim(i - 1, 0);
if (i == N) return i;
return Prefix(i + 1, p -> n[S[i] - 'a']);
}
int main()
{
start = new node;
while (scanf("%d ", &P) && gets(S))
{
N = strlen(S);
if (P == 0) Update(start, 0);
else if (P == 1) Delete(start, 0);
else if (P == 2) printf("%d\n", Nr(0, start));
else printf("%d\n", Prefix(0, start));
}
}