Submission #68791976


Source Code Expand

Copy
#include <stdio.h>
#include <inttypes.h>
enum {
NOT_STARTED = 0,
LENGTH_ODD,
LENGTH_EVEN
};
int N;
char T[212345];
uint64_t memo[212345][3][2];
uint64_t calc(int pos, int status, int is_one) {
uint64_t ans = (status == LENGTH_ODD && is_one) || (status == LENGTH_EVEN && !is_one);
if (pos >= N) return ans;
if (memo[pos][status][is_one]) return ~memo[pos][status][is_one];
switch (status) {
case NOT_STARTED:
/* */
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include <stdio.h>
#include <inttypes.h>

enum {
	NOT_STARTED = 0,
	LENGTH_ODD,
	LENGTH_EVEN
};

int N;
char T[212345];

uint64_t memo[212345][3][2];

uint64_t calc(int pos, int status, int is_one) {
	uint64_t ans = (status == LENGTH_ODD && is_one) || (status == LENGTH_EVEN && !is_one);
	if (pos >= N) return ans;
	if (memo[pos][status][is_one]) return ~memo[pos][status][is_one];
	switch (status) {
		case NOT_STARTED:
			/* スタートしない */
			ans += calc(pos + 1, NOT_STARTED, 0);
			/* スタートする */
			ans += calc(pos + 1, LENGTH_ODD, T[pos] != '0');
			break;
		case LENGTH_ODD:
			ans += calc(pos + 1, LENGTH_EVEN, is_one ^ (T[pos] != '0'));
			break;
		case LENGTH_EVEN:
			ans += calc(pos + 1, LENGTH_ODD, is_one ^ (T[pos] != '0'));
			break;
	}
	return ~(memo[pos][status][is_one] = ~ans);
}

int main(void) {
	if (scanf("%d", &N) != 1) return 1;
	if (scanf("%212344s", T) != 1) return 1;
	printf("%" PRIu64 "\n", calc(0, NOT_STARTED, 0));
	return 0;
}

/*

XORなら結果は操作の順番によらない (結合法則)
→ XNORも多分そう (予想)

操作回数が奇数 (列の長さが偶数) → 結果はXORと逆
操作回数が偶数 (列の長さが奇数) → 結果はXORと同じ

メモ化探索をする (桁DP風……でもないか)
状態:「未スタート / 奇数 / 偶数」「XORが 0 / 1」
現在の状態がvalid → 結果に1を足す

未スタート → 未スタートのままにする or スタートする (奇数に)
奇数 / 偶数 → 偶数 / 奇数 にする

*/

Submission Info

Submission Time
Task D - XNOR Operation
User mikecat
Language C (gcc 12.2.0)
Score 425
Code Size 1594 Byte
Status AC
Exec Time 20 ms
Memory 23816 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 425 / 425
Status
AC × 3
AC × 29
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_small_00.txt, 01_small_01.txt, 01_small_02.txt, 01_small_03.txt, 01_small_04.txt, 01_small_05.txt, 02_random_00.txt, 02_random_01.txt, 02_random_02.txt, 02_random_03.txt, 02_random_04.txt, 02_random_05.txt, 02_random_06.txt, 02_random_07.txt, 02_random_08.txt, 02_random_09.txt, 03_corner_00.txt, 03_corner_01.txt, 03_corner_02.txt, 03_corner_03.txt, 03_corner_04.txt, 03_corner_05.txt, 03_corner_06.txt, 03_corner_07.txt, 03_corner_08.txt, 03_corner_09.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 0 ms 1720 KiB
00_sample_01.txt AC 0 ms 1720 KiB
00_sample_02.txt AC 0 ms 1756 KiB
01_small_00.txt AC 0 ms 1600 KiB
01_small_01.txt AC 0 ms 1636 KiB
01_small_02.txt AC 0 ms 1624 KiB
01_small_03.txt AC 0 ms 1652 KiB
01_small_04.txt AC 0 ms 1712 KiB
01_small_05.txt AC 0 ms 1640 KiB
02_random_00.txt AC 18 ms 23172 KiB
02_random_01.txt AC 18 ms 23792 KiB
02_random_02.txt AC 17 ms 21696 KiB
02_random_03.txt AC 18 ms 23716 KiB
02_random_04.txt AC 17 ms 22192 KiB
02_random_05.txt AC 18 ms 23716 KiB
02_random_06.txt AC 17 ms 21772 KiB
02_random_07.txt AC 18 ms 23668 KiB
02_random_08.txt AC 17 ms 22256 KiB
02_random_09.txt AC 18 ms 23780 KiB
03_corner_00.txt AC 16 ms 23716 KiB
03_corner_01.txt AC 15 ms 23712 KiB
03_corner_02.txt AC 18 ms 23776 KiB
03_corner_03.txt AC 15 ms 23796 KiB
03_corner_04.txt AC 20 ms 23648 KiB
03_corner_05.txt AC 15 ms 23692 KiB
03_corner_06.txt AC 17 ms 23656 KiB
03_corner_07.txt AC 17 ms 23816 KiB
03_corner_08.txt AC 18 ms 23692 KiB
03_corner_09.txt AC 18 ms 23672 KiB


2025-08-25 (Mon)
04:22:45 +09:00