[USACO1.1]坏掉的项链Broken Necklace
22892 破碎的项链
方法一:很容易想到枚举断点,再分别两头找,但是要注意很多细节
#include
#include
#include
using namespace std;
string s;
int n,l,r,ll,rr,tmp,ans;
inline int calc(int x) {
ll=s[x],rr=s[x+1],l=x-1,r=x+2;
if (rr=='w') {//如果是w,需分类讨论(如10 rwrwbwrwrw,答案为10,去掉后输出9)
rr='r',tmp=x+2;
while((s[tmp]=='w' || s[tmp]==rr) && tmpx-n) l--;
while((s[r]=='w' || s[r]==rr) && r>n>>s;
s=s+s+s;
for (int i=n; i
方法二:一边做一边统计答案(思路来自这个博客)
#include
#include
#include
using namespace std;
char s[700],c;
int n,l,r,w,ans;
/*
l:左段长度,r:右段长度
w:连续w段的长度
c:当前段的颜色
*/
int main() {
scanf("%d%s",&n,s);
memcpy(s+n,s,n);
for (int i=0; i
方法三:dp(思路来自这个博客)
#include
#include
#include
using namespace std;
int n,lb[701],lr[701],rb[701],rr[701],ans;//l[i]不包括i,r[i]包括i
char s[701];
int main() {
scanf("%d%s",&n,s),memcpy(s+n,s,n),n<<=1;
for (int i=1; i=0; i--)
if (s[i]=='b') rb[i]=rb[i+1]+1;
else if (s[i]=='r') rr[i]=rr[i+1]+1;
else rb[i]=rb[i+1]+1,rr[i]=rr[i+1]+1;
for (int i=0; i>1));
}