Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int main(){
- int numberOfMessages;
- string messageSenders;
- cin >> numberOfMessages >> messageSenders;
- int minimumExcitement = 0;
- int maximumExcitement = 0;
- bool isStartF = false;
- bool isEndF = false;
- // See if there is an end F;
- if(messageSenders[0] == 'F'){
- isStartF = true;
- }
- if(messageSenders[numberOfMessages - 1] == 'F'){
- isEndF = true;
- }
- // Pass #1: look for guaranteed ones
- bool hasAllF = true;
- if(messageSenders[0] != 'F'){
- hasAllF = false;
- }
- for(int i = 0; i < numberOfMessages - 1; i++){
- if(messageSenders[i] == messageSenders[i+1] && messageSenders[i] != 'F'){
- minimumExcitement++;
- maximumExcitement++;
- }
- if(messageSenders[i + 1] != 'F'){
- hasAllF = false;
- }
- }
- // Find the first F in the last part
- int lastFStart = numberOfMessages-1;
- int index = numberOfMessages - 1;
- while(messageSenders[index] == 'F' && index >= 0){
- lastFStart--;
- index--;
- maximumExcitement++;
- }
- index = 0;
- // First go to the first non F; add one for each that exists to max
- while(messageSenders[index] == 'F' && index < numberOfMessages){
- maximumExcitement++;
- index++;
- }
- // Do the Looop; add floor(n/2) to max if it exist, add 1 to both if it is forced
- char prevItem;
- while(index < lastFStart){
- int streakLength = 0;
- if(messageSenders[index] == 'F'){
- while(messageSenders[index] == 'F'){
- streakLength++;
- index++;
- }
- if(prevItem != messageSenders[index]){
- streakLength--;
- }
- if(streakLength % 2 == 0){
- minimumExcitement++;
- }
- maximumExcitement++;
- maximumExcitement += streakLength;
- }
- prevItem = messageSenders[index];
- index++;
- }
- if(hasAllF){
- maximumExcitement = numberOfMessages -1;
- minimumExcitement = 0;
- }
- index = minimumExcitement;
- if(isStartF || isEndF){
- cout << maximumExcitement - minimumExcitement + 1 << endl;
- for(int i = 0; i < maximumExcitement - minimumExcitement + 1; i++){
- cout << index << endl;
- index++;
- }
- } else {
- cout << floor((maximumExcitement - minimumExcitement)/2 + 1) << endl;
- for(int i = 0; i < floor((maximumExcitement - minimumExcitement)/2 + 1); i++){
- cout << index << endl;
- index += 2;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement