题解 P1203 【[USACO1.1]坏掉的项链Broken Necklace】
什么?32篇题解竟然没有一个用链表做的?于是我就来写一篇用链表做的题解。利用链表可以节省空间,以免浪费。而这道题是要把环拆成链的,正好符合链表,而我用的就是循环链表。尝试每一个断点,然后开始往前往后数,数到等于n时就直接停下输出答案,否则如果颜色不一样且不为白色,就终止循环。,注意一点,如果断点是白色的,就要每循环一个点就尝试更新颜色,否则就WA了亲身经历,代码对初学者有一些不友好,请见谅。
完整代码如下:
#include<bits/stdc++.h>
using namespace std;
struct node{
node *prv,*nxt;//为了防止CE我把元音吃掉了
char color;
};//双向链表的基本模型
node *head,*tail,*p;//头指针、尾指针、辅助指针(尾指针其实只在刚开始有用)
int n,ans=1;
char c;
int main(){
scanf("%d",&n);
while(getchar()!='\n');//吃掉换行符
head=new node;//先申请一个节点
head->color=getchar();
head->prv=head,head->nxt=head,tail=head;//把前驱后继都先指向自己,且与尾指针重合
for(int i=1;i<n;++i){
p=new node;//对于每个辅助指针都先申请
p->prv=tail,p->nxt=head;//把这个指针的前驱改为尾指针,后继改成头指针
p->prv->nxt=p,p->nxt->prv=p;//接着改变头指针和尾指针的前驱与后继
tail=p,p->color=getchar();//把尾指针向后移动一位,并输入
}//这样输入完之后头指针和尾指针也相连了,符合项链的样子
p=head;//把这个指针先指向头指针
do{
node *q=p->prv;//q节点先默认为p节点的前驱
int temp=1;
char color=p->color;//把颜色先默认为p节点的颜色
while(q->color=='w'||q->color==color||color=='w'){//循环的条件
if(temp==n) return 0&printf("%d",n);//这个地方用了简写,本应写为if(temp==n){printf("%d",n);return 0;}
color=(color=='w'?q->color:color)/*如果颜色还是白色,就更新颜色*/,++temp,q=q->prv;//答案++,指针向后移动一位
}q=p->nxt,color=p->nxt->color;//把q改为p的后继,还要注意颜色应为q节点的颜色
while(q->color=='w'||q->color==color||color=='w'){
if(temp==n) return 0&printf("%d",n);
color=(color=='w'?q->color:color),++temp,q=q->nxt;//类似
}p=p->nxt,ans=max(ans,temp);//p指针向后移动一位,并尝试更新答案
}while(p!=head);
return 0&printf("%d",ans);//这个地方也是简写
}
这道题目的方法有很多种,如果看不懂我的题解你还可以看别人的题解。如果看懂了,并A了,请给我一个赞,谢谢!