题解 P1203 【[USACO1.1]坏掉的项链Broken Necklace】

[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));
}

你可能感兴趣的:(题解 P1203 【[USACO1.1]坏掉的项链Broken Necklace】)