[๋ฐฑ์ค] 5525๋ฒ - IOIOI (C++)
5525๋ฒ: IOIOI
N+1๊ฐ์ I์ N๊ฐ์ O๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉด, I์ O์ด ๊ต๋๋ก ๋์ค๋ ๋ฌธ์์ด์ PN์ด๋ผ๊ณ ํ๋ค. P1 IOI P2 IOIOI P3 IOIOIOI PN IOIOI...OI (O๊ฐ N๊ฐ) I์ O๋ก๋ง ์ด๋ฃจ์ด์ง ๋ฌธ์์ด S์ ์ ์ N์ด ์ฃผ์ด์ก์ ๋, S์์ PN์ด ๋ช
www.acmicpc.net
๋ฌธ์
N+1๊ฐ์ I์ N๊ฐ์ O๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉด, I์ O์ด ๊ต๋๋ก ๋์ค๋ ๋ฌธ์์ด์ PN์ด๋ผ๊ณ ํ๋ค.
- P1 IOI
- P2 IOIOI
- P3 IOIOIOI
- PN IOIOI...OI (O๊ฐ N๊ฐ)
I์ O๋ก๋ง ์ด๋ฃจ์ด์ง ๋ฌธ์์ด S์ ์ ์ N์ด ์ฃผ์ด์ก์ ๋, S์์ PN์ด ๋ช ๊ตฐ๋ฐ ํฌํจ๋์ด ์๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์๋ S์ ๊ธธ์ด M์ด ์ฃผ์ด์ง๋ฉฐ, ์ ์งธ ์ค์ S๊ฐ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
S์ PN์ด ๋ช ๊ตฐ๋ฐ ํฌํจ๋์ด ์๋์ง ์ถ๋ ฅํ๋ค.
์ ํ
- 1 ≤ N ≤ 1,000,000
- 2N+1 ≤ M ≤ 1,000,000
- S๋ I์ O๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋ค.
์๋ธํ์คํฌ
1 | 50 | N ≤ 100, M ≤ 10 000. |
2 | 50 | ์ถ๊ฐ์ ์ธ ์ ์ฝ ์กฐ๊ฑด์ด ์๋ค. |
ํ์ด๊ณผ์
์ด ๋ฌธ์ ๋ ์ ๋ง ๋ค๋ฐฉ๋ฉด์ผ๋ก ์ ๊ทผ์ ํด๋ดค๋ ๊ฑฐ ๊ฐ๋ค.
๋ฌธ์ ์์ ์ํ๋ ์๊ตฌ์ฌํญ์ด s(๋ฌธ์์ด)์์ ๋ด๊ฐ ์ํ๋ ๋ฌธ์์ด์ด ์๋์ง ํ์ธํด์ผํ๋ ๋ฌธ์ ์ด๋ค๋ณด๋
ํ๋ํ๋์ฉ ๋ค ๋์ ํด๋ณด๋ ๋ฐฉ์๊ณผ KMP๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ฐฉ์ ๋ชจ๋๋ฅผ ์ฌ์ฉํด๋ณด์์๋ค.
1. ์ฒ์์๋ ํ๋ํ๋์ฉ ๋ค ํ์ธํ๋ ๋ฐฉ์
2. KMP๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ฌธ์์ด ๊ฒ์์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ
1๋ฒ ๋ฐฉ๋ฒ๊ฐ์ ๊ฒฝ์ฐ๋ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฌ๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ ๊ฑฐ๋ผ๋๊ฑด ์๊ณ ์์์ง๋ง
2๋ฒ ๋ฐฉ๋ฒ๊น์ง ์๊ฐ์ด ๋์ด์ค๊ฑฐ๋ฆฌ๋๊ฑฐ๋ ์๊ฐํ์ง๋ชปํ์๋ค.
๊ทธ๋์ ์์๋ธ ๋ฐฉ๋ฒ์ด
3. S๋ฌธ์์ด 1๋ฒ๋ง ๋๋ ๋ฐฉ๋ฒ
์ ์ฌ์ฉํด์ ํด๊ฒฐํ์๋ค. ๋ฌธ์ ์์ ์ฃผ์ด์ง๋ ๋ฌธ์์ด ์์ฒด๊ฐ "IOI..." ํ์์ผ๋ก ๋ฐ๋ณต์ด ๋๋ค๋ณด๋
๊ทธ์ ์ ์ฌ์ฉํ์ฌ ์๊ณ ๋ฆฌ์ฆ ํ์ด๋ฅผ ๋ง๋ค์ด๋ด์๋ค.
code
#include <iostream>
#include <string>
int main(void)
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
int n, m, count, k;
std::string str;
std::cin >> n >> m >> str;
count = 0;
for (int i = 0; i < m; i++) {
if (str[i] == 'I') {
k = 0;
while (str[i + 1] == 'O' && str[i + 2] == 'I')
{
k++;
if (k == n) {
k--;
count++;
}
i += 2;
}
}
}
std::cout << count << "\n";
return (0);
}
ํ๊ธฐ
๊ณ ์ํด์ KMP๋ผ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ณต๋ถํ๊ณ ๋ฌธ์ ํด๊ฒฐ์ ๋์ ๊น์ง ํ์๋๋ฐ
KMP์กฐ์ฐจ ์๊ฐ์ด๊ณผ๊ฐ ๋๋ ์ฝ๊ฐ ํ๋ฌดํด์ก๋ ๋ฌธ์ ๊ฐ๋ค.
3๋ฒ๊ฐ์ด ๊ฐ๋จํ๊ฒ ํธ๋ ๋ฐฉ๋ฒ์ด ์์๋ค๋..