ps:problems:boj:15485
a^ib^jc^k
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 15485 |
문제명 | a^ib^jc^k |
레벨 | 골드 2 |
분류 |
dp |
시간복잡도 | O(n) |
인풋사이즈 | n<=1,000,000 |
사용한 언어 | Python 3.11 |
제출기록 | 33212KB / 204ms |
최고기록 | 204ms |
해결날짜 | 2023/07/17 |
풀이
- 거의 비슷한 문제를 많이 봤던것 같은 느낌의 DP.
- dp_a[i], dp_b[i], dp_c[i] 를 S[:i+1]안에 포함된 $a^i$, $a^ib^j$, $a^ib^jc^k$ 의 갯수라고 각각 정의하자
- S[i]=='a' 라면 S[:i+1]에 있는 $a^i$들은 S[:i]안에 있었던 $a^i$들 + S[:i]안에 있었던 $a^i$ 에 s[i]를 뒤에 붙인 것 + 그냥 s[i] 한글자로 이루어진것, 이렇게 해서 dp_a[i] = dp_a[i-1]*2+1 이 된다.
- S[i]=='b' 라면 S[:i+1]에 있는 $b^i$들은 S[:i]안에 있었던 $b^i$들 + S[:i]안에 있었던 $b^i$ 에 s[i]를 뒤에 붙인 것 + S[:i]안에 있었던 $a^i$ 뒤에 s[i]를 붙인것, 이렇게 해서 dp_b[i] = dp_b[i-1]*2+dp_a[i-1] 이 된다.
- S[i]=='c'일때도 'b'일때봐 비슷하게 dp_c[i]를 구한다.
- dp테이블 한칸을 채우는데에 O(1)이므로 총 시간복잡도는 O(n)
코드
"""Solution code for "BOJ 15485. \(a^ib^jc^k\)".
- Problem link: https://www.acmicpc.net/problem/15485
- Solution link: http://www.teferi.net/ps/problems/boj/15485
"""
MOD = 1_000_000_007
def main():
S = input()
count_a = count_b = count_c = 0
for c in S:
if c == 'a':
count_a = (count_a * 2 + 1) % MOD
elif c == 'b':
count_b = (count_b * 2 + count_a) % MOD
elif c == 'c':
count_c = (count_c * 2 + count_b) % MOD
print(count_c)
if __name__ == '__main__':
main()
ps/problems/boj/15485.txt · 마지막으로 수정됨: 2023/07/23 13:04 저자 teferi
토론