1 条题解

  • 0
    @ 2025-4-14 18:43:47

    C++ :

    #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;
    }
    
    

    Pascal :

    program beads;
    var s:ansistring;
        bl,rl,br,rr:array[0..351]of integer;
        i,n,max,temp:integer;
    begin
      readln(n);
      readln(s);
      bl[0]:=0;
      rl[0]:=0;
      for i:=1 to n do     
      begin
        case s[i] of
          'r':
          begin
            rl[i]:=rl[i-1]+1;
            bl[i]:=0;
          end;
          'b':
          begin
            bl[i]:=bl[i-1]+1;
            rl[i]:=0;
          end;
          'w':
          begin
            bl[i]:=bl[i-1]+1;
            rl[i]:=rl[i-1]+1;
          end;
        end;
      end;
      bl[0]:=bl[n];
      rl[0]:=rl[n];
      for i:=1 to n do    
      begin
        case s[i] of
          'r':
          begin
            rl[i]:=rl[i-1]+1;
            bl[i]:=0;
          end;
          'b':
          begin
            bl[i]:=bl[i-1]+1;
            rl[i]:=0;
          end;
          'w':
          begin
            bl[i]:=bl[i-1]+1;
            rl[i]:=rl[i-1]+1;
          end;
        end;
        if rl[i]>n then rl[i]:=n;
        if bl[i]>n then bl[i]:=n;
      end;
      br[n+1]:=0;
      rr[n+1]:=0;
      for i:=n downto 1 do 
      begin
        case s[i] of
          'r':
          begin
            rr[i]:=rr[i+1]+1;
            br[i]:=0;
          end;
          'b':
          begin
            br[i]:=br[i+1]+1;
            rr[i]:=0;
          end;
          'w':
          begin
            br[i]:=br[i+1]+1;
            rr[i]:=rr[i+1]+1;
          end;
        end;
      end;
      br[n+1]:=br[1];
      rr[n+1]:=rr[1];
      for i:=n downto 1 do 
      begin
        case s[i] of
          'r':
          begin
            rr[i]:=rr[i+1]+1;
            br[i]:=0;
          end;
          'b':
          begin
            br[i]:=br[i+1]+1;
            rr[i]:=0;
          end;
          'w':
          begin
            br[i]:=br[i+1]+1;
            rr[i]:=rr[i+1]+1;
          end;
        end;
        if rr[i]>n then rr[i]:=n;
        if br[i]>n then br[i]:=n;
      end;
      bl[n+1]:=bl[1];
      br[n+1]:=br[1];
      rl[n+1]:=rl[1];
      rr[n+1]:=rr[1];
      max:=-1;
      for i:=1 to n do
      begin
        if bl[i]>rl[i]then temp:=bl[i] else temp:=rl[i];
        if br[i+1]>rr[i+1]then inc(temp,br[i+1]) else inc(temp,rr[i+1]);
        if temp>max then max:=temp;
        if max>n then max:=n;
      end;
      writeln(max);
    end.
    
    • 1

    信息

    ID
    3252
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者