题解 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; }