HUAWEI Programming Contest 2024(AtCoder Beginner Contest 342)の解説記事です。
目次
ABC342 A – Yay!
問題
問題文の要約は以下の通りです。
問題の要約
ある1文字を除いて全て同じ文字で構成されている英小文字からなる文字列 \(S\) が与えられます。他のどの文字とも異なる文字は前から何文字目か求めよ。
制約
・\(S\) は 2 種類の英小文字からなる長さ 3 以上 100 以下の文字列
・\(S\) はある 1 文字を除いて全て同じ文字
入力
\(S\)
出力
答えを出力せよ。
解説
count
を用いて、1回しか出現しない文字がどこにあるか調べる。
解説
まず入力 \(S\) を文字列として受け取ります。
# 入力
S=input()
1回しか出現しない文字がどこにあるか調べます。for
文で \(S\) の長さまでループを回します。\(S\) のi
番目の文字が \(S\) に1回しか出現しない場合はi+1
を出力します。これは文字列が0-indexed
になっているためです。
# 1回しか出現しない文字がどこにあるか調べる
for i in range(len(S)):
if S.count(S[i])==1:
print(i+1)
exit()
解答
# 入力
S=input()
# 1回しか出現しない文字がどこにあるか調べる
for i in range(len(S)):
if S.count(S[i])==1:
print(i+1)
exit()
ABC342 B – Which is ahead?
問題
解説
\(A\) と\(B\) の位置をクエリの度に探索する。
解説
入力を受け取ります。
# 入力
N=int(input())
P=list(map(int, input().split()))
Q=int(input())
各クエリの入力を受け取り、\(A\) と\(B\) の位置を探索します。
\(A\) と \(B\) の位置を比較し、\(A\) が \(B\) より前に来る場合は \(A\)を出力し、そうでない場合は \(B\) を出力します。
# 各クエリに対して繰り返し処理を行う。
for _ in range(Q):
# 各クエリの入力
A,B=map(int, input().split())
# P内のAの位置を探索
a=P.index(A)
# P内のBの位置を探索
b=P.index(B)
# AとBの位置を比較する。AがBより前に来る場合はAを出力し、そうでない場合はBを出力する。
if a < b:
print(A)
else:
print(B)
解答
# 入力
N=int(input())
P=list(map(int, input().split()))
Q=int(input())
# 各クエリに対して繰り返し処理を行う。
for _ in range(Q):
# 各クエリの入力
A,B=map(int, input().split())
# P内のAの位置を探索
a=P.index(A)
# P内のBの位置を探索
b=P.index(B)
# AとBの位置を比較する。AがBより前に来る場合はAを出力し、そうでない場合はBを出力する。
if a < b:
print(A)
else:
print(B)
ABC342 C – Many Replacement
問題
解説
各文字がどの文字に変換されるかを格納する辞書を用いて、操作ではその辞書を更新する。
解説
文字列 \(S\) を直接操作するのでは制限時間に間に合いません。
各文字がどの文字に変換されるかを格納する辞書を用いて、操作ではその辞書を更新します。
解答
# 入力の
N=int(input())
S=input()
Q=int(input())
# 各文字がどの文字に変換されるかを格納する辞書(初期は自身の文字)
char_map = {chr(i): chr(i) for i in range(ord('a'), ord('z')+1)}
# Q 回の操作を実行
for _ in range(Q):
# 入力
c,d=input().split()
# 文字cを文字dに変換する
for key in char_map:
if char_map[key]==c:
char_map[key]=d
# 結果の出力
print(''.join(char_map[chr] for chr in S))