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:/* スタートしない */
#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 |
|
|
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 |