Cod sursa(job #18113)

Utilizator mugurelionutMugurel-Ionut Andreica mugurelionut Data 18 februarie 2007 09:29:22
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <stdio.h>

#define BIGINT long long // __int64
#define fmtrd "%lld" //"%I64d"
#define fmtwr "%lld\n" // "%I64d\n"

#define NMAX 510000

BIGINT x[NMAX], a[NMAX];
int prefix[NMAX];
int i, k, N, ok;

int main()
{
	freopen("reguli.in", "r", stdin);

	scanf("%d", &N);

	for (i = 0; i < N; i++)
		scanf(fmtrd, &x[i]);

	for (i = 1; i < N; i++)
		a[i] = x[i] - x[i - 1];

	// KMP - functia prefix

	prefix[1] = k = 0;

	for (i = 2; i < N; i++)
	{
		while (k > 0 && a[k + 1] != a[i])
			k = prefix[k];

		if (a[k + 1] == a[i])
			k++;

		prefix[i] = k;
	}

	k = N - 1 - prefix[N - 1];

	ok = 1;

	for (i = k + 1; i < N; i++)
		if (a[i] != a[i - k])
		{
			ok = 0;
			break;
		}

	if (!ok)
		k = N - 1;

	freopen("reguli.out", "w", stdout);

	printf("%d\n", k);

	for (i = 1; i <= k; i++)
		printf(fmtwr, a[i]);

	return 0;
}