Pagini recente » Cod sursa (job #2386299) | Cod sursa (job #2899931) | Cod sursa (job #470965) | Cod sursa (job #1358101) | Cod sursa (job #1553594)
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct trie
{
trie *nxt[32], *phi;
int val, vall/*, lg*/;
trie ()
{
val = vall = /*lg =*/ 0;
for (int i = 0; i < 27; ++i)
nxt[i] = NULL;
// phi = NULL;
}
} *p, *v, *q/*, *poz*/;
char ss[32];
int main ()
{
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
int op;
scanf ("%d ", &op);
gets (ss);
p = new trie;
p -> val = p -> vall = 0;
// p -> lg = 0;
do
{
if (!op)
{
v = p;
int k = 0, n = strlen (ss);
while (k < n && v -> nxt[ss[k] - 'a'] != NULL)
{
v = v -> nxt[ss[k] - 'a'];
++(v -> vall);
++k;
}
if (k < n)
for (int i = k; i < n; ++i)
{
q = v;
q = new trie;
v -> nxt[ss[i] - 'a'] = q;
q -> val = 0;
q -> vall = 1;
/*q -> lg = i + 1;
while (v -> phi != NULL)
{
v = v -> phi;
if (v -> nxt[ss[k] - 'a'] != NULL) q -> phi = v -> nxt[ss[k] - 'a'];
}
v = q;
if (v -> phi == NULL) v -> phi = p;*/
v = q;
}
++(v -> val);
}
else if (op == 1)
{
v = p;
int k = 0, n = strlen (ss), ck = -1;
while (k < n && v -> nxt[ss[k] - 'a'] != NULL)
{
// if (v -> val && k < n - 1) poz = v, ck = k;
v = v -> nxt[ss[k] - 'a'];
--(v -> vall);
++k;
}
--(v -> val);
/* if (ck > -1 && !(v -> val))
while (ck < n && v -> nxt[ss[ck]])
{
q = v;
++ck;
v = v -> nxt[ss[ck]];
q -> nxt = NULL;
}*/
}
else if (op == 2)
{
v = p;
int k = 0, n = strlen (ss);
while (k < n && v -> nxt[ss[k] - 'a'] != NULL)
{
v = v -> nxt[ss[k] - 'a'];
++k;
}
if (k < n) printf ("0\n");
else printf ("%d\n", v -> val);
}
else
{
v = p;
int k = 0, n = strlen (ss);
while (k < n && v -> nxt[ss[k] - 'a'] != NULL && (v -> nxt[ss[k] - 'a']) -> vall)
{
v = v -> nxt[ss[k] - 'a'];
++k;
}
printf ("%d\n", k);
}
scanf ("%d ", &op);
gets (ss);
} while (!feof (stdin));
return 0;
}