kotazon.com

虎太郎の備忘録

【AtCoder-Ruby】累積和をマスターする

累積和を何も考えずに書けるようにする! を自分なりに理解する。

考え方

f:id:kharigai:20190531075233p:plain

サンプル実装

puts "L R N"
puts "a1 a2 a3 a4 .. aN"
puts
puts "input: " 

L, R, N = gets.strip.split.map(&:to_i)
a = gets.strip.split.map(&:to_i)

# 累積和の初期化
s = Array.new(N + 1) {0}

N.times do |i|
  s[i + 1] = a[i] + s[i]
end

puts "ans: #{s[R] - s[L - 1]}"
$ ruby cumulative_sum.rb
L R N
a1, a2, a3, a4, .. an

input:
3 5 7
1 2 3 4 5 6 7

ans: 12

練習問題

ABC122 C - GeT AC を解いてみる。

問題文

A, C, G, T からなる長さ N の文字列 S が与えられます。
以下の Q 個の問いに答えてください。

  • 問 i ( 1 ≤ i ≤ Q): 整数 l i , r i ( 1 ≤ l i < r i ≤ N) が与えられる。 S の先頭から l i 文字目から r i 文字目までの (両端含む) 部分文字列を考える。この文字列に AC は部分文字列として何回現れるか。

考え方

f:id:kharigai:20190531075636p:plain

回答

N, Q = gets.strip.split.map(&:to_i)
S = gets.strip

lr = Q.times.map { gets.strip.split.map(&:to_i) }

a = Array.new(N + 1) {0}

N.times do |i|
  a[i + 1] = S[i..(i+1)].eql?('AC') ? a[i] + 1 : a[i]
end

lr.each do |l, r|
  puts a[r - 1] - a[l - 1]
end

考察

2次元の累積和は一旦概念だけ理解。
あとで実装する。

この投稿をInstagramで見る

どや

虎太朗さん(@kotazon)がシェアした投稿 -