Cod sursa(job #226602)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 2 decembrie 2008 02:06:52
Problema Trie Scor Ascuns
Compilator cpp Status done
Runda Marime 1.21 kb
#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;
}