Pagini recente » Cod sursa (job #3266085) | Cod sursa (job #1027179) | Cod sursa (job #2864588) | Cod sursa (job #795641) | Cod sursa (job #382995)
Cod sursa(job #382995)
//folosind hash_set
#include <stdio.h>
#include <algorithm>
#include <string>
#include <set>
using namespace std;
#define maxn 100010
#define maxl 25
int n;
char cuv[maxn][maxl];
int len[maxn], p[maxn], q[maxn], nr[maxn];
int tip[maxn];
set <int> S;
int cmp(int x, int y)
{
return string(cuv[x]) < string(cuv[y]);
}
int cmp2(int x, int y)
{
int i, l = min(len[x], len[y]);
for (i=0; i<l && cuv[x][i]==cuv[y][i]; i++);
return i;
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int i, v1, v2;
set <int> :: iterator I;
while (!feof(stdin))
{
n++;
scanf("%d %s ", &tip[n], cuv[n]);
len[n] = strlen(cuv[n]);
p[n] = n;
}
sort(p+1, p+n+1, cmp);
S.insert(n+1);
for (i=1; i<=n; i++)
if (string(cuv[p[i]]) == string(cuv[p[i-1]])) q[p[i]] = q[p[i-1]];
else q[p[i]] = i;
for (i=1; i<=n; i++)
{
if (tip[i] == 0)
{
S.insert(q[i]);
nr[q[i]]++;
}
if (tip[i] == 1)
{
nr[q[i]]--;
if (nr[q[i]] == 0) S.erase(q[i]);
}
if (tip[i] == 2) printf("%d\n", nr[q[i]]);
if (tip[i] == 3)
{
v1 = v2 = 0;
I = S.lower_bound(q[i]);
v1 = cmp2(i, p[*I]);
if (I != S.begin())
{
I--;
v2 = cmp2(i, p[*I]);
}
printf("%d\n", max(v1, v2));
}
}
return 0;
}