/*
参与者从项链的某处将它截断拉直;接着从一端向另外一端收集同颜色的珠子,直到碰到一个不同
颜色的珠子为止;然后再从另外一端做同样的操作。(一端收集的珠子颜色可以不同于另一端的)
*/
/*
问题:w开头如何处理?
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int count();
int W_head();
int turn(char ch[], int t, int flag)
{
if( (flag==1) && (t==strlen(ch)) )/*右端末端,回到头部*/
t=0;
if( (flag==-1) && (t<0) )/*左端末端,回到尾部*/
t=strlen(ch)-1;
return t;
}
int W_head(char ch[], int wa, int flag)/*如果首位为w*/
{
char headx=ch[wa];
int ws=0;
if(headx=='w' || headx=='W')
{
int ix=wa;
while( ch[ix]=='w' || ch[ix]=='W')
{
ws++;
ix+=flag;
ix=turn(ch, ix, flag);
}
}
return ws;
}
int count(char arr[], int cut)/*cut为切片处右边第一个*/
{
/*printf("这里是count===》》》%d\n",cut);*/
int right=0, left=0;
int flag=1;
if (flag==1)/*往右*/
{
int w=W_head(arr, cut, flag);/*判断头部为w的情况*/
char head=arr[cut+w];
int i=cut + w;
right+=w;
while(arr[i]==head || arr[i]=='w' || arr[i]=='W')
{
right++;
i++;
i=turn(arr, i, flag);
if(i==cut)/*如果整条项链都是,需要这个退出*/
break;
}
}
flag = -1;
if (flag==-1)/*往左*/
{
int w=W_head(arr, cut-1, flag);/*判断头部为w的情况*/
char head = arr[cut-1-w];
int j = cut - 1 - w;
left+=w;
while(arr[j]==head || arr[j]=='w' || arr[j]=='W')
{
left++;
j--;
j=turn(arr, j, flag);
if(j==cut)/*如果整条项链都是,需要这个退出*/
break;
}
}
/*printf("========>>>left+right是:%d\n", left+right);*/
return left+right;
}
main()
{
int N=0;
char necklace[355];
memset(necklace,0,sizeof(necklace));
while(scanf("%d",&N) != EOF)
{
getchar();
scanf("%s",necklace);
/*printf("这是necklace===》》》%s\n",necklace);*/
int cut=0,max=0;
while( cut < strlen(necklace) )
{
int sum=count(necklace,cut);
max=( max<sum ? sum:max );
/*printf("它的max是:%d\n",max);*/
cut++;
}
printf("%d\n",max);
}
return 0;
}
/*
wwwbbrbwrwrrb
*/
改了好久,最后发现往左时cut少减一,提交却只绿了一半,结果错误,还有一个超时
学艺不精啊。。。。