提出 #55931016
ソースコード 拡げる
N, K = map(int, input().split()) S = sorted(input()) palindrome_count = 0 # 長さKの回文の個数 palindrome_check = [0] * (N - K + 1) # 長さKの文字列それぞれに対して、回文になっている文字の位置のフラグ is_palindrome = (1 << (K + 1 >> 1)) - 1 # フラグが回文となる条件 for l in range(N - K + 1): for i in range(K + 1 >> 1): if S[l + i] == S[l + K - 1 - i]: palindrome_check[l] ^= 1 << i if palindrome_check[l] == is_palindrome: palindrome_count += 1 def toggle(i): # i番目の文字が@でないなら@に、@なら元の文字に変えた時の差分更新 global palindrome_count for l in range(max(0, i - K + 1), min(i, N - K) + 1): # S[l, l+K)の回文について更新 if palindrome_check[l] == is_palindrome: palindrome_count -= 1 flag_index = i - l # 先頭から見て何文字目か opposite = K - 1 - flag_index if flag_index > opposite: flag_index, opposite = opposite, flag_index if S[l + flag_index] == S[l + opposite]: palindrome_check[l] ^= 1 << flag_index if palindrome_check[l] == is_palindrome: palindrome_count += 1 # swapした時の差分更新を高速に行う def swap(i, j): toggle(i) toggle(j) S[i], S[j] = S[j], S[i] toggle(i) toggle(j) # next_permutationを求める def next_permutation(S): for i in range(N - 1)[::-1]: if S[i] >= S[i + 1]: continue for j in range(i + 1, N)[::-1]: if S[i] < S[j]: break swap(i, j) for l in range(i + 1, N): r = N + i - l if l >= r: break swap(l, r) return True return False ans = 1 if palindrome_count == 0 else 0 while next_permutation(S): if palindrome_count == 0: ans += 1 print(ans)
提出情報
| 提出日時 | |
|---|---|
| 問題 | C - Avoid K Palindrome 2 |
| ユーザ | cirno3153 |
| 言語 | Python (PyPy 3.10-v7.3.12) |
| 得点 | 300 |
| コード長 | 1736 Byte |
| 結果 | AC |
| 実行時間 | 1478 ms |
| メモリ | 89200 KiB |
ジャッジ結果
| セット名 | Sample | All | ||||
|---|---|---|---|---|---|---|
| 得点 / 配点 | 0 / 0 | 300 / 300 | ||||
| 結果 |
|
|
| セット名 | テストケース |
|---|---|
| Sample | example_00.txt, example_01.txt, example_02.txt |
| All | example_00.txt, example_01.txt, example_02.txt, hand_00.txt, hand_01.txt, hand_02.txt, hand_03.txt, hand_04.txt, hand_05.txt, hand_06.txt, random_00.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, random_17.txt, random_18.txt, random_19.txt, random_20.txt, random_21.txt, random_22.txt, random_23.txt, random_24.txt, random_25.txt, random_26.txt, random_27.txt |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| example_00.txt | AC | 56 ms | 76484 KiB |
| example_01.txt | AC | 57 ms | 76236 KiB |
| example_02.txt | AC | 443 ms | 86828 KiB |
| hand_00.txt | AC | 56 ms | 76380 KiB |
| hand_01.txt | AC | 58 ms | 76388 KiB |
| hand_02.txt | AC | 1478 ms | 84208 KiB |
| hand_03.txt | AC | 1275 ms | 86396 KiB |
| hand_04.txt | AC | 57 ms | 76688 KiB |
| hand_05.txt | AC | 274 ms | 87904 KiB |
| hand_06.txt | AC | 264 ms | 88176 KiB |
| random_00.txt | AC | 56 ms | 76432 KiB |
| random_01.txt | AC | 56 ms | 76348 KiB |
| random_02.txt | AC | 56 ms | 76300 KiB |
| random_03.txt | AC | 60 ms | 80716 KiB |
| random_04.txt | AC | 56 ms | 76348 KiB |
| random_05.txt | AC | 69 ms | 81440 KiB |
| random_06.txt | AC | 116 ms | 84164 KiB |
| random_07.txt | AC | 91 ms | 83708 KiB |
| random_08.txt | AC | 113 ms | 83840 KiB |
| random_09.txt | AC | 142 ms | 85940 KiB |
| random_10.txt | AC | 118 ms | 83736 KiB |
| random_11.txt | AC | 311 ms | 87408 KiB |
| random_12.txt | AC | 159 ms | 85764 KiB |
| random_13.txt | AC | 190 ms | 86176 KiB |
| random_14.txt | AC | 534 ms | 86008 KiB |
| random_15.txt | AC | 185 ms | 85796 KiB |
| random_16.txt | AC | 416 ms | 89200 KiB |
| random_17.txt | AC | 549 ms | 86172 KiB |
| random_18.txt | AC | 56 ms | 76812 KiB |
| random_19.txt | AC | 55 ms | 76312 KiB |
| random_20.txt | AC | 65 ms | 81344 KiB |
| random_21.txt | AC | 58 ms | 80452 KiB |
| random_22.txt | AC | 95 ms | 83616 KiB |
| random_23.txt | AC | 130 ms | 84272 KiB |
| random_24.txt | AC | 103 ms | 83424 KiB |
| random_25.txt | AC | 103 ms | 83208 KiB |
| random_26.txt | AC | 207 ms | 85668 KiB |
| random_27.txt | AC | 208 ms | 85984 KiB |