#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// 内部定数
#define D_AML_MAX		100000									// 最大動物数
#define D_AML_NONE		'\0'									// 動物 - なし
#define D_AML_SHEEP		'S'										// 動物 - 羊
#define D_AML_WOLF		'W'										// 動物 - 狼
#define D_ANS_OK		'o'										// 回答 - 〇
#define D_ANS_NG		'x'										// 回答 - ×

// 内部変数
static int siACnt;												// 動物数
static char sc1Ans[D_AML_MAX + 5];								// 動物の回答
static char sc1Aml[D_AML_MAX + 5];								// 動物の並び

// 内部変数 - テスト用
#ifdef D_TEST
	static int siRes;
	static FILE *szpFpT, *szpFpA;
#endif

// 両隣の動物の一致チェック
int
fAnlSame(
	int piANo					// <I> 位置 0～
)
{
	if (sc1Aml[piANo] == D_AML_SHEEP) {		// 羊
		if (sc1Ans[piANo] == D_ANS_OK) {		// 回答 - 〇
			return 0;
		}
	}
	else {									// 狼
		if (sc1Ans[piANo] == D_ANS_NG) {		// 回答 - ×
			return 0;
		}
	}

	return -1;
}

// 右隣にセットする動物の取得
char
fAnlGetR(
	int piANo					// <I> 位置 0～
)
{
	// 両隣の動物の一致チェック
	int liSame = fAnlSame(piANo);

	// 右隣の動物
	if (liSame == 0) {								// 一致
		if (sc1Aml[piANo - 1] == D_AML_SHEEP) {			// 羊
			return D_AML_SHEEP;
		}
	}
	else {											// 不一致
		if (sc1Aml[piANo - 1] == D_AML_WOLF) {			// 狼
			return D_AML_SHEEP;
		}
	}

	return D_AML_WOLF;
}

// 動物の正当性チェック
int
fAnlChk(
	int piANo					// <I> 位置 0～
)
{
	// 右隣にセットする動物の取得
	char lcAml = fAnlGetR(piANo);

	// 正当性チェック
	if (sc1Aml[piANo + 1] != lcAml) {
		return -1;
	}

	return 0;
}

// 動物の並び - セット - 子関数 - 回答チェック
int
fSetAmlChk(
)
{
	int i, liRet;

	// ２匹目～ｎ－２匹目の動物セット
	for (i = 1; i < siACnt - 2; i++) {
		sc1Aml[i + 1] = fAnlGetR(i);
	}

	// ｎ－１匹目の動物の回答とｎ匹目の動物の正当性チェック
	liRet = fAnlChk(siACnt - 2);
	if (liRet != 0) {
		return -1;
	}

	// ｎ匹目の動物の回答と１匹目の動物の正当性チェック
	liRet = fAnlChk(siACnt - 1);
	if (liRet != 0) {
		return -1;
	}

	return 0;
}

// 動物の並び - セット - 子関数
int
fSetAmlK(
	char pcAml					// <I> １匹目の動物
	, int piPtn					// <I> パターン 1 or 2
)
{
	// 初期化
	memset(sc1Aml, D_AML_NONE, sizeof(sc1Aml));

	// １匹目をセット
	sc1Aml[0] = pcAml;
	sc1Aml[siACnt] = pcAml;

	// ２匹目とｎ匹目の一致チェック
	int liSame = fAnlSame(0);

	// ２匹目とｎ匹目をセット
	if (liSame == 0) {					// 一致
		if (piPtn == 1) {					// パターン１
			sc1Aml[1] = D_AML_SHEEP;
			sc1Aml[siACnt - 1] = D_AML_SHEEP;
		}
		else {								// パターン２
			sc1Aml[1] = D_AML_WOLF;
			sc1Aml[siACnt - 1] = D_AML_WOLF;
		}
	}
	else {								// 不一致
		if (piPtn == 1) {					// パターン１
			sc1Aml[1] = D_AML_SHEEP;
			sc1Aml[siACnt - 1] = D_AML_WOLF;
		}
		else {								// パターン２
			sc1Aml[1] = D_AML_WOLF;
			sc1Aml[siACnt - 1] = D_AML_SHEEP;
		}
	}

	// 回答チェック
	return fSetAmlChk();
}

// 動物の並び - セット
int
fSetAml(
)
{
	int liRet;

	// １匹目 - 羊 - パターン１
	liRet = fSetAmlK(D_AML_SHEEP, 1);
	if (liRet == 0) {
		return 0;
	}

	// １匹目 - 羊 - パターン２
	liRet = fSetAmlK(D_AML_SHEEP, 2);
	if (liRet == 0) {
		return 0;
	}

	// １匹目 - 狼 - パターン１
	liRet = fSetAmlK(D_AML_WOLF, 1);
	if (liRet == 0) {
		return 0;
	}

	// １匹目 - 狼 - パターン２
	liRet = fSetAmlK(D_AML_WOLF, 2);
	if (liRet == 0) {
		return 0;
	}

	return -1;
}

// 実行メイン
int
fMain(
	int piTNo					// <I> テスト番号 1～
)
{
	char lc1Buf[1024], lc1Out[D_AML_MAX + 5];

	// テストファイルオープン
#ifdef D_TEST
	sprintf(lc1Buf, ".\\Test\\T%d.txt", piTNo);
	szpFpT = fopen(lc1Buf, "r");
	sprintf(lc1Buf, ".\\Test\\A%d.txt", piTNo);
	szpFpA = fopen(lc1Buf, "r");
	siRes = 0;
#endif

	// 動物数取得
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpT);
#else
	fgets(lc1Buf, sizeof(lc1Buf), stdin);
#endif
	sscanf(lc1Buf, "%d", &siACnt);

	// 動物の回答取得
#ifdef D_TEST
	fgets(sc1Ans, sizeof(sc1Ans), szpFpT);
#else
	fgets(sc1Ans, sizeof(sc1Ans), stdin);
#endif

	// 動物の並び - セット
	int liRet = fSetAml();

	// 結果セット
	if (liRet == 0) {
		sc1Aml[siACnt] = '\0';
		sprintf(lc1Out, "%s\n", sc1Aml);
	}
	else {
		sprintf(lc1Out, "-1\n");
	}

	// 結果表示
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, lc1Out)) {
		siRes = -1;
	}
#else
	printf("%s", lc1Out);
#endif

	// テストファイルクローズ
#ifdef D_TEST
	fclose(szpFpT);
	fclose(szpFpA);
#endif

	// テスト結果
#ifdef D_TEST
	if (siRes == 0) {
		printf("OK %d\n", piTNo);
	}
	else {
		printf("NG %d\n", piTNo);
	}
#endif

	return 0;
}

int
main()
{

#ifdef D_TEST
	int i;
	for (i = D_TEST_SNO; i <= D_TEST_ENO; i++) {
		fMain(i);
	}
#else
	fMain(0);
#endif

	return 0;
}



Measured memory_bytes: 512