من خودم به جواب نرسيدم، ولي يکي تو تاپيک الگوريتم جوابشا گذاشت، اگه رو جوابشم يکم تحليل کنيم خوبه .....
/*
ID: amir.ju1
LANG: C++
TASK: beads
*/
//Author: Amir Joudaki
#include <iostream>
using namespace std;
int Break_R(char *beads, int k, int len) {
char c = beads[k];
int i = 0;
while(beads[k]=='w' && i<len) {
k = k < len-1 ? k+1 : 0;
i++;
}
c = beads[k];
while((beads[k]==c || beads[k]=='w') && i < len) {
i++;
k = k < len-1 ? k+1 : 0;
}
return i;
}
int Break_L(char *beads, int k, int len) {
k = k > 0 ? k-1 : len-1;
char c = beads[k];
int i = 0;
while(beads[k]=='w' && i<len) {
k = k > 0 ? k-1 : len-1;
i++;
}
c = beads[k];
while((beads[k]==c || beads[k]=='w') && i < len) {
i++;
k = k > 0 ? k-1 : len-1;
}
return i;
}
int Break(char* beads, int k, int len) {
int r = Break_R(beads, k, len),
l = Break_L(beads, k, len);
if( r + l >= len )
return len;
else
return r + l;
}
int main() {
FILE *fin, *fout;
fin = fopen("beads.in", "r");
fout = fopen("beads.out", "w");
int N, // number of beads
collectedBeads,
max = 0;
fscanf(fin, "%d", &N);
char* beads = new char[N+1]; // the beads
fscanf(fin, "%s", beads);
for(int i=0; i<N; i++) {
collectedBeads = Break(beads, i, strlen(beads));
max = max > collectedBeads ? max : collectedBeads;
}
fprintf(fout, "%d\n", max);
return 0;
}