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 |