1.1 broken neckless(一直想用O(N)复杂度的方法写,写了两天两个百多行的都跪了,还是乖乖用O(N^2)复杂度的方法写算了)

来源:互联网 发布:阿里云注销 编辑:程序博客网 时间:2024/05/01 14:53
/*
ID:15521201
LANG:C++
PROG:beads
*/


#include <iostream>
#include <cstdio>
#include <cstring>


using namespace std;


char neckless[500];
int n;


int main()
{
    freopen("beads.in","r",stdin);
    freopen("beads.out","w",stdout);
    int left(char t,int m);
    int right(char t,int m);
    int i,j,sum,t,single;
    char temp;
    cin>>n>>neckless;
    for(i=0,single=0;i<n;i++)
    {
        if(single==0&&neckless[i]!='w')
        {
            single=1;
            temp=neckless[i];
        }
        else if(single==1&&neckless[i]!='w'&&neckless[i]!=temp)
        {
            single=2;
            temp=neckless[i];
        }
        else if(single==2&&neckless[i]!='w'&&neckless[i]!=temp)
        {
            single=3;
            break;
        }
    }
    if(single==3)
    {
    temp='0';
    for(i=0,sum=0;i<n;i++)
    {
        if(neckless[i]!='w'&&neckless[i]!=temp)
        {
            t=left(neckless[i],i)+right(neckless[i],i);
            sum=(sum>t)?sum:t;
            temp=neckless[i];
        }
    }
    }
    else sum=n;
    cout<<sum<<endl;
    return 0;
}


int left(char t,int m)
{
    int i,sum;
    for(i=m-1,sum=0;i!=m;i--)
    {
        if(i==-1)i=n-1;
        if(neckless[i]!=t)
            sum++;
        else if(neckless[i]==t)
            break;
    }
    return (sum);
}


int right(char t,int m)
{
    int i,sum;
    for(i=m+1,sum=1;i!=m;i++)
    {
        if(i==n)i=0;
        if(neckless[i]==t||neckless[i]=='w')
            sum++;
        else if(neckless[i]!=t||neckless[i]!='w')
            break;
    }
    return (sum);


}


思路就是在至少为(r~~~w~~~r或者w~~~r~~~w的格式下),当找到一次转变时(转变:前一非‘w’字符为‘r’,第一次穿线‘b’或相反),从该字符左边
第一位开始循环到出现和该字符相同为止,把其中的‘w’和与它不同的字符出现数代为left,同理,从该字符右边第一位开始循环到出现于该字符不同的字符
且不为‘w’为止,把其中的‘w’和与它相同的字符字符出现数代为right。
吧left和right相加,求每次的最大值。
0 0
原创粉丝点击