PythonでABC380を解いてみたので、解法の記録を残します。
https://atcoder.jp/contests/abc380
A - 123233
https://atcoder.jp/contests/abc380/tasks/abc380_a
for
文で$1$、$2$、$3$それぞれの数を数えます。
n = input()
one = 0
two = 0
three = 0
for i in n:
if i == "1":
one += 1
elif i == "2":
two += 1
elif i == "3":
three += 1
if one == 1 and two == 2 and three == 3:
print("Yes")
else:
print("No")
B - Hurdle Parsing
https://atcoder.jp/contests/abc380/tasks/abc380_b
文字列をfor
で回し、その中で|
かそうでないかで分岐させて数えます。
s = input()
lst = []
cnt = 0
for c in s:
if c == "|":
lst += [cnt]
cnt = 0
else:
cnt += 1
lst = lst[1:]
l = [str(i) for i in lst]
print(" ".join(l))
C - Move Segment
https://atcoder.jp/contests/abc380/tasks/abc380_c
正規表現を使って1
の塊の開始地点と終了地点を求めます。
移動は、$K-1$番目の終了地点を書き換え、$K$番目を削除する形で行います。
import re
n, k = map(int, input().split())
s = input()
m = re.finditer("1+", s)
one_list = [list(i.span()) for i in m]
str_list = ["0"] * n
one_list[k-2][1] += one_list[k-1][1] - one_list[k-1][0]
del one_list[k-1]
for i in one_list:
for j in range(i[0], i[1]):
str_list[j] = "1"
res = "".join(str_list)
print(res)
D - Strange Mirroring
https://atcoder.jp/contests/abc380/tasks/abc380_d
まず、$K_i$番目の文字が$S$の何番目にあたるかは剰余で求まります。
問題は、大文字小文字が反転しているかです。
入力例1で考えます。
$S$はaB
で、$1$回操作するとaBAb
、$2$回操作するとaBAbAbaB
となります。
このとき、aB
やAb
をグループと呼ぶことにします。
$K_i$番目の文字が何番目のグループに属しているかは割り算で求まります。
そうなると、あとは$n$番目のグループが何回反転されたかを求めるだけになります。
文字列が連結されていく過程を見ていきます。
最初は$0$番目のグループaB
のみです。
$1$回操作が行われると、$1$番目のグループAb
が追加されます。
$2$回目の操作では、$2$番目のグループAb
と$3$番目のグループaB
が追加されます。
$2$回目の操作を分けて考えると、$0$番目のグループを反転したものが$2$番目のグループ、$1$番目のグループを反転したものが$3$番目のグループになっていることがわかります。
一般化して考えると、$m$回目の操作では、$0$番目のグループを反転したものが$2^{m-1}$番目のグループ、$1$番目のグループを反転したものが$2^{m+1}+1$番目のグループ、…、$2^{m-1}-1$番目のグループを反転したものが$2^m-1$番目のグループとなることがわかります。
$0$と$2^{m-1}$、$1$と$2^{m-1}+1$、…、$2^{m-1}-1$と$2^m-1$の関係はそれぞれ「前の数字の下(LSB)から$m$ビットを立てたものが後の数字」となっています。
つまり、$n$番目は、$n$を2進数表記したときに$1$が奇数個あれば「反転されている」、偶数個あれば「もとのままになっている」ということです。
s = input()
q = int(input())
k = map(int, input().split())
length = len(s)
for i in k:
idx = i - 1
group, pos = divmod(idx, length)
popcount = group.bit_count()
res = s[pos]
if popcount % 2 == 1:
res = res.swapcase()
print(res, end=" ")