提出 #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
結果
AC × 3
AC × 38
セット名 テストケース
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