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

看楼上楼下题解都大大的短,我就发布个长点的!。。。      
这道题目其实就是一道模拟的题目,用最最简单的办法就是把s串变为s+s+s,这样子方便首尾连应,然后判断一下当前s[i]和s[j]是否相等,或者s[j]='w'的时候则可以继续下去,这里有个地方需要注意的是:一个被遇到的白色珠子可以被当做红色也可以被当做蓝色。这里强调了是被遇到,也就是说当前面全是w,而现在忽然出现了一个'b','r'都是不行的。也可以说成当当前第i个字符是'w'的时候无需模拟下去(除针对数据——如全是'w')。         
============================完美分割线=============================

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char s[700],c=0;
    int n,i,temp=0,num=0,w=0,ans=0;
    cin>>n>>s;
    memcpy(s+n,s,n);//copy
    for (i=0;i<n*2;i++)
        if (s[i]=='w') num++,w++; //如果是w,把它视为当前颜色,并计数,下面有用
        else if (s[i]==c) num++,w=0;//是当前连续的颜色,计数,w清零
        else //不是的话
        {
            if (temp+num>ans) ans=temp+num;//做一次比较,记录ans
            temp=num-w;num=w+1;w=0;c=s[i];//连续的颜色改变,就开始用temp记录,比如wwwbrwrbww,生成wwwbrwrbwwwwwbrwrbww;
                                           //  一开始是w那么w++;在s【3】时改变temp=0;因为没别的颜色。w就看作b;b=4;
                                           //下一次颜色改变,temp=4,num=1;因为b后没有w这时连续颜色为r有w;以此类推;
                                           //这样子不断重复,其实就是过滤w,只有r,b只要求一个点左边连续的rrrbbbb呀就行在改变点
                                           //断开就可以了;当然会有重复,比如wwwwbbbbrrrr,这是就输出n
                                           //最后的语句就是判断
        }
    if (temp+num>ans) ans=temp+num;//
    cout<<(ans>n?n:ans)<<endl;//
    return 0;
}



猜你喜欢

转载自www.cnblogs.com/Sworddust/p/11427829.html