Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

블로그 언저리인 무언가

[백준/BOJ] 5525 IOIOI 본문

Programming/BOJ

[백준/BOJ] 5525 IOIOI

he1fire 2020. 9. 19. 00:43
728x90

문제 : 5525 IOIOI

 

5525번: IOIOI

첫째 줄에 N이 주어진다. 둘째 줄에는 S의 길이 M이 주어지며, 셋째 줄에 S가 주어진다. (1 ≤ N ≤ 1,000,000, 2N+1 ≤ M ≤ 1,000,000)

www.acmicpc.net

x가 주어졌을 때, x+1개의 I와 x개의 O가 교대하는 문자열의 개수를 찾아 출력하는 문제이다.

그냥 중첩 반복문을 사용해 풀게 되면 O(N^2)으로 시간 초과가 나게 되므로

시간을 O(N)으로 줄여야 한다.

가장 길게 교대하는 문자열의 크기가 y이라고 할 때,

안에 속하는 부분 문자열의 개수는 y-x+1 임을 활용하여 풀면 된다.


Code

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    ll N, M, ans=0;
    string S;
    cin >> N >> M >> S;
    for (int i=0;i<M;i++){
        if (S[i]=='I'){
            ll cnt=0;
            while (S[i+1]=='O' && S[i+2]=='I'){
                cnt++;
                i+=2;
            }
            if (cnt>=N)
                ans+=cnt-N+1;
        }
    }
    cout << ans;
    return 0;
}
728x90

'Programming > BOJ' 카테고리의 다른 글

[백준/BOJ] 2166 다각형의 면적  (1) 2020.09.19
[백준/BOJ] 9019 DSLR  (0) 2020.09.19
[백준/BOJ] 1780 종이의 개수  (0) 2020.09.19
[백준/BOJ] 1213 팰린드롬 만들기  (0) 2020.09.18
[백준/BOJ] 1531 투명  (0) 2020.09.18
Comments