This problem has been asked here but that's not what I am looking for.
Greetings everybody! I was solving the broken necklace problem which is a USACO Problem. Here is the problem:
You have a necklace of N red, white, or blue beads (3<=N<=350) some of which are red, others blue, and others white, arranged at random. Here are two examples for n=29:
1 2 1 2
r b b r b r r b
r b b b
r r b r
r r w r
b r w w
b b r r
b b b b
b b r b
r r b r
b r r r
b r r r
r r r b
r b r r r w
Figure A Figure B
r red bead
b blue bead
w white bead
The beads considered first and second in the text that follows have been marked in the picture.
The configuration in Figure A may be represented as a string of b's and r's, where b represents a blue bead and r represents a red one, as follows: brbrrrbbbrrrrrbrrbbrbbbbrrrrb .
Suppose you are to break the necklace at some point, lay it out straight, and then collect beads of the same color from one end until you reach a bead of a different color, and do the same for the other end (which might not be of the same color as the beads collected before this).
Determine the point where the necklace should be broken so that the most number of beads can be collected.
Example: For example, for the necklace in Figure A, 8 beads can be collected, with the breaking point either between bead 9 and bead 10 or else between bead 24 and bead 25.
In some necklaces, white beads had been included as shown in Figure B above. When collecting beads, a white bead that is encountered may be treated as either red or blue and then painted with the desired color. The string that represents this configuration can include any of the three symbols r, b and w.
Write a program to determine the largest number of beads that can be collected from a supplied necklace.
Actually I tried to solve the problem using C++. However, I seem to be getting a wrong answer in case 3 which is
77 rwrwrwrwrwrwrwrwrwrwrwrwbwrwbwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwr
My code outputs 72 but the answer is 74. I can't even see how the answer is 74 (don't we have to subtract that 5 b block to get 77-5=72) How do we get 74? How is my code wrong and which cases am I missing? I can't seem to be able to debug this code...
Any helps would be appreciated. Thank You.
#include <bits/stdc++.h>
using namespace std;
int main(){
//For faster I/O
ios::sync_with_stdio(0);
cin.tie(0);
//read and write files
freopen("beads.in", "r", stdin);
freopen("beads.out", "w", stdout);
//get as input all the bead colors
int N; cin >> N;
char beads[N]; for(int i=0;i<N;i++) cin >> beads[i];
//the max amount of stuff we can get
int maxCount = INT_MIN;
//some helper variables we'll need later
int currCount = 0; int counter1 = 0; int counter2 = 0; char currColor = 'w';
for(int i=0;i<N;i++){
//set counter1 and counter2 both to 0
counter1 = 0; counter2 = 0;
//the iterator
int j;
//First loop - forwards
//---------------------
j = i;
currColor = beads[i];
while(beads[j]==currColor || beads[j]=='w'){
if(currColor == 'w' && beads[j] != 'w') currColor = beads[j];
if(j==N-1) j=0;
else j++;
counter1++;
if(counter1 > N) break;
}
//Second loop - backwards
//-----------------------
j = (i>0) ? i-1 : N-1;
currColor = (i>0) ? beads[i-1] : beads[N-1];
while(beads[j]==currColor || beads[j]=='w'){
if(currColor == 'w' && beads[j] != 'w') currColor = beads[j];
if(j==0) j=N-1;
else j--;
counter2++;
if(counter2 > N) break;
}
//get the current count and get max value
currCount = counter1 + counter2;
maxCount = max(currCount,maxCount);
}
if(maxCount > N) cout << N;
else cout << maxCount;
cout << "\n";
return 0;
}