0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AtCoder ABC380 ABCD

Last updated at Posted at 2024-11-16

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となります。
このとき、aBAbをグループと呼ぶことにします。
$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=" ")
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?