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

// 内部定数
#define D_ARRAY_MAX		200000									// 最大配列数

// 内部変数
static int si1Array[D_ARRAY_MAX];								// 配列
static int siACnt;												// 配列数
static int si1Xor[D_ARRAY_MAX];									// 連続Xor
static int siXCnt;												// 連続Xor数
static int si1Dpl[D_ARRAY_MAX];									// 重複Xor
static int siDCnt;												// 重複Xor数

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

// 連続Xorセット
int
fSetXor(
	int piSNo					// <I> 開始番号 0～
	, int piENo					// <I> 終了番号 0～
)
{
	return 0;
}

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

	// データ初期化
	memset(si1Xor, 0, sizeof(si1Xor));							// 連続Xor
	siXCnt = 0;													// 連続Xor数
	siDCnt = 0;													// 重複Xor数

	// テストファイルオープン
#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);

	// 配列取得
	for (i = 0; i < siACnt; i++) {
#ifdef D_TEST
		fscanf(szpFpT, "%d", &si1Array[i]);
#else
		fscanf(stdin, "%d", &si1Array[i]);
#endif
	}
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpT);
#else
	fgets(lc1Buf, sizeof(lc1Buf), stdin);
#endif

	// 連続Xor・重複Xorセット
	int liSNo = 0;
	int liENo = 0;
	int liSum1 = 0;
	int liXor1 = 0;
	int liSum2, liXor2;
	int liCnt = 0;
	while (1) {

		// 加算・Xor
		while (liENo < siACnt) {
			liSum2 = liSum1 + si1Array[liENo];
			liXor2 = liXor1 ^ si1Array[liENo];

			// 判定
			if (liSum2 != liXor2) {			// 不一致
				break;
			}

			// 一致データ更新
			liSum1 = liSum2;
			liXor1 = liXor2;
			liCnt++;

			// 後ろへ伸ばす
			liENo++;
		}

		// 連続Xor加算
		si1Xor[siXCnt] = liCnt;
		siXCnt++;

		// 終了チェック
		if (liENo >= siACnt) {
			break;
		}

		// 減算
		while (liSNo < liENo) {
			liSum1 -= si1Array[liSNo];
			liXor1 -= si1Array[liSNo];
			liSNo++;

			// 次回を加算
			liSum2 = liSum1 + si1Array[liENo];
			liXor2 = liXor1 ^ si1Array[liENo];

			// 判定
			if (liSum2 != liXor2) {			// 不一致
				continue;
			}

			// 重複Xor加算
			liCnt = liENo - liSNo;
			if (liCnt > 0) {
				si1Dpl[siDCnt] = liCnt;
				siDCnt++;
			}

			break;
		}
	}

	long long llPtn = 0;

	// 連続Xorからパターン数加算
	for (i = 0; i < siXCnt; i++) {
		llPtn += (long long)si1Xor[i] * (long long)(si1Xor[i] + 1) / 2;		// 1～si1Xor[i]の和を加算
	}

	// 重複Xorからパターン減算
	for (i = 0; i < siDCnt; i++) {
		llPtn -= (long long)si1Dpl[i] * (long long)(si1Dpl[i] + 1) / 2;		// 1～si1Dpl[i]の和を加算
	}

	// 結果セット
	sprintf(lc1Out, "%lld\n", llPtn);

	// 結果表示
#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: 1920