유진이는 딜러와 카드 게임을 한다.
딜러는 앞면에 스페이드(♠) 또는 하트(♡) 문양이 그려져 있는 N장의 카드 묶음을 가지고 있다. 카드는 처음에 뒷면이 보이도록 임의의 순서로 쌓여 있다. 딜러는 모든 카드의 앞면을 알지만, 유진이는 각 카드의 앞면을 모른다.
딜러는 게임을 시작하기 전에 1 이상 N 이하의 정수 K를 부른다. 유진이의 목표는 위에서 K번째 스페이드 카드를 찾는 것이다. 이제 다음과 같이 게임이 진행된다.
딜러가 모든 카드를 내려놓고 나면 딜러는 다시 원래 순서대로 카드를 정리한다. 그다음에 유진이에게 정답을 맞힐 기회가 단 한 번 주어진다. 유진이는 둘 중 하나의 선언을 할 수 있다.
유진이의 선언이 올바르다면 유진이의 승리, 그렇지 않으면 딜러의 승리다.
유진이는 게임을 지는 것을 싫어하기 때문에, 어떤 경우에도 유진이가 승리할 수 있는 필승 전략으로 게임을 진행하려고 한다. 예를 들어, 딜러가 카드를 내려놓을 때마다 “스탑!”을 외치는 전략은 유진이가 반드시 K번째 카드를 찾을 수 있으므로 필승 전략이다.
유진이는 필승 전략 중에서 가장 적은 동전을 지불하는 전략을 사용하기로 했다. 어떠한 카드 배열이 주어지더라도 다른 필승 전략보다 작거나 같은 양의 동전을 지불해야 하며, 이러한 전략이 존재함을 증명할 수 있다.
처음 카드 배열이 입력으로 주어진다. 1부터 N까지의 모든 K 값에 대해, 유진이가 딜러에게 지불해야 하는 동전의 개수가 각각 몇 개인지 구하시오.
첫 번째 줄에 카드의 수 N이 주어진다. (1≤N≤106)
두 번째 줄에 카드 묶음을 나타내는 길이 N의 문자열이 주어진다. i번째 문자는 위에서 i번째 카드의 문양을 나타내며, S는 스페이드, H는 하트이다.
한 줄에 N개의 정수를 공백으로 구분하여 출력한다. i번째 정수는 K=i일 때 유진이가 딜러에게 지불해야 하는 동전의 개수이다.
첫 번째 예제에서, 딜러가 K=2를 부른 경우의 예시를 보자.
유진이는 위와 같은 과정으로 8개의 동전을 지불하고 K번째 스페이드 카드를 찾을 수 있다.