どうもこんにちは!
今週のコンテストはBまで完答、振り返りもBまで。
3連続で2完です。。くやしい。
Cは文字をスタックして()の組み合わせができたときに削除でやろうとしたんですが、例えば((()))から末尾を2つ消したときにスタックは((が追加されるんですよね。これに気付くのが終了5分程度前で間に合わずタイムアップしました。
問題と公式の解説のリンク
問題は以下のリンクから。
A - Grandma's Footsteps -
問題
整数s,a,b,xが与えられます。毎秒sメートルでa秒間進んだのちにb秒間を休むことを繰り返すとしたとき、x秒後は何メートル進んでいるかを出力する問題。
考え方とコード
x秒間の中にa+b秒間が何回繰り返せるかを計算し、sと繰り返し回数の積を算出します。次に残った時間がa秒以上ならsとaの積、a秒未満ならsと残った時間の積の合計が答えとなります。
これを順番に実装しました。
s,a,b,x = map(int,input().split())
c = a+b
ans = 0
ans += s * a * (x // c)
r = x % c
if r <= a:
ans += r * s
else:
ans += s * a
print(ans)
B - Most Frequent Substrings -
問題
長さNの文字列と整数Kが与えられます。文字列からK文字分を先頭からずらしつつ抜き出すとしたときに、同じ文字列が一番多く出る回数が何回かとその文字列を辞書順に出力する問題。
例えば、文字列がovovoで3文字分としたときに、ovo,vov,ovoという文字列が作れることになります。このときovoが2回出るので答えは2とovoを出力することになります。
考え方とコード
辞書を使って、文字列を走査してK文字の文字列と出現回数を記録します。次に最大回数を確認して、その文字列をピックアップします。最後にピックアップした文字列をソートして最大回数とともに出力としました。
n,k = map(int,input().split())
s = input()
d = {}
for i in range(n-k+1):
st = s[i:i+k]
if st not in d:
d[st] = 1
else:
d[st] += 1
ans_n = max(d.values())
ans = []
for st,i in d.items():
if i == ans_n:
ans.append(st)
ans.sort()
print(ans_n)
print(*ans)
ではでは。