Broken Necklace
Description
你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的。 这里是 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
图片 A 图片 B
r 代表 红色的珠子 b 代表 蓝色的珠子 w 代表 白色的珠子
第一和第二个珠子在图片中已经被作记号。 图片 A 中的项链可以用下面的字符串表示: brbrrrbbbrrrrrbrrbbrbbbbrrrrb . 假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在 另一端做同样的事(颜色可能与在这之前收集的不同)。 确定应该在哪里打破项链来收集到最大多数的数目的珠子。 例如,在图片 A 中的项链中,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之间打断项链可以收集到8个珠子。 在一些项 链中还包括白色的珠子(如图片B) 所示。 当收集珠子的时候,一个被遇到的白色珠子可以被当做红色也可以被当做蓝色。 表现含有白珠项链的字符串将会包括三个符号 r , b 和 w 。 写一个程序来确定从一条被给出的项链可以收集到的最大珠子数目。
Input
第 1 行: N, 珠子的数目 第 2 行: 一串长度为N的字符串, 每个字符是 r , b 或 w。
Output
单独的一行包含从被供应的项链可以被收集的珠子数目的最大值。
Sample Input
29
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
Sample Output
11
好长好长的代码 总之注意几个例子 www bwb bbb 都应该输出3
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <deque>
using namespace std;
typedef long long ll;
deque <char> q;
int main()
{
char a[399],t,c;
char m='w';
int aa=0,b=0,cc=0;
int n,i,j,sum=0,max1=0;
cin>>n;
for(i=0; i<n; i++)
{
cin>>c;
if(c=='r')
aa++;
else
if(c=='b')
b++;
else
cc++;
q.push_back(c);
}
if(cc==n||aa==n||b==n)
{
cout<<n<<endl;
return 0;
}
ll h=0;
for(i=0;i<n;i++)
{
sum=0;
h=0;
while(1)
{
t=q.back();
if(t=='r')
{
c='r';
break;
}
else
if(t=='b')
{
c='b';
break;
}
q.pop_back();
if(q.empty())
{
cout<<n<<endl;
return 0;
}
h++;
}
if(q.empty())
{
cout<<n<<endl;
return 0;
}
for(j=h-1;j>=0;j--)
q.push_back(m);
memset(a,0,sizeof(a));
h=0;
while(1)
{
t=q.back();
if(t=='w'||t==c)
sum++;
else
break;
if(sum>=n)
{
cout<<n<<endl;
return 0;
}
q.pop_back();
a[h++]=t;
}
for(j=h-1;j>=0;j--)
{
q.push_back(a[j]);
}
memset(a,0,sizeof(a));
h=0;
while(1)
{
t=q.front();
if(t=='r')
{
c='r';
break;
}
else
if(t=='b')
{
c='b';
break;
}
else
{
q.pop_front();
h++;
}
}
//for(j=h-1;j>=0;j--)
// q.push_front(m);
while(1)
{
t=q.front();
if(t=='w'||t==c)
sum++;
else
break;
a[h++]=t;
q.pop_front();
}
//q.push_back(a[0]);
for(j=h-1;j>=0;j--)
q.push_front(a[j]);
if(sum>=max1)
max1=sum;
char t=q.front();
q.pop_front();
q.push_back(t);
// int siz=q.size();
// for(j=0;j<siz;j++)
// {
// char t=q.front();
// cout<<t;
// q.pop_front();
// q.push_back(t);
// }
// cout<<endl;
}
if(max1>=n)
cout<<n<<endl;
else
cout<<max1<<endl;
return 0;
}