Broken Necklace

/*

ID: lxlenovos1

PROG: beads

LANG: C++

*/



#include <iostream>

#include <fstream>

#include <string>

#include <vector>

#include <string.h>

#include <stdlib.h>

#include <stdio.h>



using namespace std;



typedef struct ring

{

        char a;

        struct ring *flink;

        struct ring *slink;

} ring;





ring* sring = NULL;

ring* hring = NULL;     /* the first node */

ring* ering = NULL;     /* the end node */

int fcout = 0;

int rcout = 0;

ring* bring = NULL;



void ring_pushback( ring* r, int n )

{

        static int i = 0;



        if ( i == 0 )

        {

                sring = r;

                ++i;



               ++i;

                hring = r;

        }

        else

        {

                sring->slink = r;

                r->flink = sring;



                sring = r;



                /* the end node */

                if ( i == n - 1 )

                {

                        sring->slink = hring;

                        hring->flink = sring;

                        ering = sring;

                }



                ++i;

        }



}





int get_maxresult( ring *gring )

{

        // cout the list

        ring* p = NULL;

        char tempvalue;



        fcout = 1;

        rcout = 1;

        p = gring;

        tempvalue = p->a;



        //cout << "temp1 is " << tempvalue << endl;     



        do

        {



              //tempvalue = p->a;

                p = p->slink;



                //cout  << p->a << endl; 

                if ( p->a == tempvalue || p->a == 'w' || tempvalue == 'w' )

                {

                        if ( tempvalue == 'w' )

                                tempvalue = p->a;







                        if ( 0 == fcout )

                                fcout = 1;

                        ++fcout;

                        //cout << "1" << endl;

                }

                else

                {

                        //cout << "2" << endl;

                        break;

                }



        }while( p != gring );



        if ( p == gring )

                goto __cout;



        p = gring->flink;

        tempvalue = p->a;



        //cout << "temp2 is " << tempvalue << endl;



        do

        {

              //tempvalue = p->a;

              p = p->flink;



              //cout << p->a << endl;



          if ( p->a == tempvalue || p->a == 'w' || tempvalue == 'w' )

                {

                        if ( tempvalue == 'w' )

                                tempvalue = p->a;



                        if ( 0 == rcout )

                                rcout = 1;

                        ++rcout;

                        //cout << "1" << endl;

                }

                else

                {

                        //cout << "2" << endl;

                        break;

                }



        }while( p != gring );



        return ( rcout + fcout );



        __cout:

                rcout = 0;

                fcout--;

                return ( rcout + fcout );

}





int main( void )

{



        ofstream fout( "beads.out" );

        ifstream fin( "beads.in" );



        int n, i, result;

        char temp;

        int max = 0;

        ring* g = NULL;



        //cin >> n;

        fin >> n;



        for ( i = 0; i < n; ++i )

        {

                //cin >> temp;

                fin >> temp;



                ring* bread = new ring;

                bread->a = temp;

                bread->flink = NULL;

                bread->slink = NULL;



                ring_pushback( bread, n );

        }



        //cout << "cin is end and the result is:" << endl;



        g = hring;

        for ( i = 0; i < n; ++i )

        {

                result = get_maxresult( g );

                //cout << "result is " << result << endl;



                if ( result > max )

                        max = result;



                if ( max >= n )

                {

                        max = n;

                        break;

                }



                g = g->slink;

                //cout << g->a << endl;

        }



        //cout << max << endl;

        fout << max;

        fout << endl;



        exit( 0 );

}

  

你可能感兴趣的:(BR)