Saturday, August 18, 2018

CHAIN STRING


  • Problem Description

    Remo went to the shop to buy a chain for his girlfriend. The shopkeeper has shown him a chain made of some expensive stones. The chain has n stones marked from 0 to n-1. The ith stone is connected with ((i+1)%n)th stone for each 0 i < n. Each stone can be either Ruby or Amber.

    Nemo defines beauty factor B of a chain as the maximum number of consecutive stones of same type.

    Nemo wants to chose exactly one stone i and exchange it with a stone with different type. So if the ith stone is ruby, Nemo will exchange it with Amber and vice-versa. He wants to do it in such a way that the value B is as small as possible.

    Given the configuration of the chain, can you find the minimum value of B that Nemo can get after exchanging exactly one stone? Note that, Its not allowed to change positions of the stones, the new stone must be placed in the same position as the original stone.
    Input

    First line contains number of test cases T (1<= T <= 2500). For each test cases, there is a single line containing a string S (1 <= |S| <= 105) denoting the chain. Here |S| denotes the length or number of characters in the string. The string is made of only R (Ruby) and A (Amber). Total number of characters in the input file will be less than 5 x 106.
    Output

    For each test case, print the case number and the answer in a single line. Look at the output for sample input for details.
  • CODING ARENA
  • #include <stdio.h>
    #include<string.h>
    int main()
    {
      int p0,p1,p2,m1,m2,l,tl,single=0,t,i;
      scanf("%d",&t);
      char arr[100001];
      for(i=0;i<t;++i)
      {
        single=0;
        m1=0;m2=0;
        scanf("%s",arr);
        l=strlen(arr);
        p1=1;
        if(l==1)
          printf("%d\n",1);
        else
          
        {
          while(arr[0]==arr[p1])
            p1++;
          p0=p1;
          if(p1==l)
            printf("%d\n",l-1);
          else
          {
            do
            {
              tl=1;
              p2=p1;
              if(p2==l-1)
                p2=-1;
              while(arr[p1]==arr[p2+1])
              {
                tl++;
                p2++;
                if(p2==l-1)
                  p2=-1;
              }
              if(tl==1)
                single++;
              if(tl>m2)
              {
                m2=tl;
                if(m2>m1)
                {
                  m2=m1;
                  m1=tl;
                }
              }
              p1=p2+1;
            }
            while(p1!=p0);
            if(m1>2)
            {
              m1=m1/2;
              if(m1>m2)
                printf("%d\n",m1);
              else
                printf("%d\n",m2);
            }
            else if(m1==2)
            {
              if(single>=1)
                printf("%d\n",2);
              else
                printf("%d\n",3);
            }
            else
            {
              if(l==2)
                printf("%d\n",2);
              else
                printf("%d\n",3);
            }
          }
        }
      }
      return 0;
    }
            
            
          

  • Test Case 1

    Input (stdin)
    2
    
    RRRAAAARAA
    
    ARRRRAAA
    
    
    Expected Output
    3
    
    4
  • Test Case 2

    Input (stdin)
    2
    
    RRAAAARA
    
    AAAAAARRA
    
    
    Expected Output
    2
    
    3

No comments:

Post a Comment