Delsträng delbarhet med 11 frågor

Givet ett stort antal n (med siffror upp till 10^6) och olika frågor i nedanstående form:

Query(l r) : find if the sub-string between the indices l and r (Both inclusive) are divisible by 11.  


Exempel:   

Input: n = 122164154695 Queries: l = 0 r = 3 l = 1 r = 2 l = 5 r = 9 l = 0 r = 11 Output: True False False True Explanation: In the first query 1221 is divisible by 11 In the second query 22 is divisible by 11 and so on. 

Vi vet att vilket tal som helst är delbart med 11 om skillnaden mellan summan av udda indexerade siffror och summan av jämna indexerade siffror är delbar med 11, dvs. 
Summa (siffror på udda platser) - Summa (siffror på jämna platser) ska vara delbart med 11 .
Därför är tanken att förbehandla en extra array som skulle lagra summan av siffror på udda och jämna platser. 
För att utvärdera en fråga kan vi använda hjälparrayen för att svara på den i O(1).  

C++
   // C++ program to check divisibility by 11 in   // substrings of a number string   #include          using     namespace     std  ;   const     int     MAX     =     1000005  ;   // To store sums of even and odd digits   struct     OddEvenSums   {      // Sum of even placed digits      int     e_sum  ;      // Sum of odd placed digits      int     o_sum  ;   };   // Auxiliary array   OddEvenSums     sum  [  MAX  ];   // Utility function to evaluate a character's   // integer value   int     toInt  (  char     x  )   {      return     int  (  x  )     -     48  ;   }   // This function receives the string representation   // of the number and precomputes the sum array   void     preCompute  (  string     x  )   {      // Initialize everb      sum  [  0  ].  e_sum     =     sum  [  0  ].  o_sum     =     0  ;      // Add the respective digits depending on whether      // they're even indexed or odd indexed      for     (  int     i  =  0  ;     i   <  x  .  length  ();     i  ++  )      {      if     (  i  %  2  ==  0  )      {      sum  [  i  +  1  ].  e_sum     =     sum  [  i  ].  e_sum  +  toInt  (  x  [  i  ]);      sum  [  i  +  1  ].  o_sum     =     sum  [  i  ].  o_sum  ;      }      else      {      sum  [  i  +  1  ].  o_sum     =     sum  [  i  ].  o_sum  +  toInt  (  x  [  i  ]);      sum  [  i  +  1  ].  e_sum     =     sum  [  i  ].  e_sum  ;      }      }   }   // This function receives l and r representing   // the indices and prints the required output   bool     query  (  int     l    int     r  )   {      int     diff     =     (  sum  [  r  +  1  ].  e_sum     -     sum  [  r  +  1  ].  o_sum  )     -      (  sum  [  l  ].  e_sum     -     sum  [  l  ].  o_sum  );      return     (  diff  %  11  ==  0  );   }   //driver function to check the program   int     main  ()   {      string     s     =     '122164154695'  ;      preCompute  (  s  );      cout      < <     query  (  0       3  )      < <     endl  ;      cout      < <     query  (  1       2  )      < <     endl  ;      cout      < <     query  (  5       9  )      < <     endl  ;      cout      < <     query  (  0       11  )      < <     endl  ;      return     0  ;   }   
Java
   // Java program to check divisibility by 11 in   // subStrings of a number String   class   GFG   {       static     int     MAX     =     1000005  ;       // To store sums of even and odd digits   static     class   OddEvenSums   {      // Sum of even placed digits      int     e_sum  ;          // Sum of odd placed digits      int     o_sum  ;   };       // Auxiliary array   static     OddEvenSums     []  sum     =     new     OddEvenSums  [  MAX  ]  ;       // Utility function to evaluate a character's   // integer value   static     int     toInt  (  char     x  )   {      return     x     -     48  ;   }       // This function receives the String representation   // of the number and precomputes the sum array   static     void     preCompute  (  String     x  )   {      // Initialize everb      sum  [  0  ]  .  e_sum     =     sum  [  0  ]  .  o_sum     =     0  ;          // Add the respective digits depending on whether      // they're even indexed or odd indexed      for     (  int     i     =     0  ;     i      <     x  .  length  ();     i  ++  )      {      if     (  i     %     2     ==     0  )      {      sum  [  i     +     1  ]  .  e_sum     =     sum  [  i  ]  .  e_sum     +     toInt  (  x  .  charAt  (  i  ));      sum  [  i     +     1  ]  .  o_sum     =     sum  [  i  ]  .  o_sum  ;      }      else      {      sum  [  i     +     1  ]  .  o_sum     =     sum  [  i  ]  .  o_sum     +     toInt  (  x  .  charAt  (  i  ));      sum  [  i     +     1  ]  .  e_sum     =     sum  [  i  ]  .  e_sum  ;      }      }   }       // This function receives l and r representing   // the indices and prints the required output   static     boolean     query  (  int     l       int     r  )   {      int     diff     =     (  sum  [  r     +     1  ]  .  e_sum     -     sum  [  r     +     1  ]  .  o_sum  )     -      (  sum  [  l  ]  .  e_sum     -     sum  [  l  ]  .  o_sum  );          return     (  diff     %     11     ==     0  );   }       //driver function to check the program   public     static     void     main  (  String  []     args  )   {      for     (  int     i     =     0  ;     i      <     MAX  ;     i  ++  )     {      sum  [  i  ]     =     new     OddEvenSums  ();      }      String     s     =     '122164154695'  ;          preCompute  (  s  );          System  .  out  .  println  (  query  (  0       3  )     ?     1     :     0  );      System  .  out  .  println  (  query  (  1       2  )     ?     1     :     0  );      System  .  out  .  println  (  query  (  5       9  )     ?     1     :     0  );      System  .  out  .  println  (  query  (  0       11  )     ?     1     :     0  );       }   }   // This code is contributed by Rajput-Ji   
Python3
   # Python3 program to check divisibility by    # 11 in subStrings of a number String   MAX   =   1000005   # To store sums of even and odd digits   class   OddEvenSums  :   def   __init__  (  self     e_sum     o_sum  ):   # Sum of even placed digits   self  .  e_sum   =   e_sum   # Sum of odd placed digits   self  .  o_sum   =   o_sum   sum   =   [  OddEvenSums  (  0     0  )   for   i   in   range  (  MAX  )]   # This function receives the String   # representation of the number and   # precomputes the sum array   def   preCompute  (  x  ):   # Initialize everb   sum  [  0  ]  .  e_sum   =   sum  [  0  ]  .  o_sum   =   0   # Add the respective digits    # depending on whether    # they're even indexed or   # odd indexed   for   i   in   range  (  len  (  x  )):   if   (  i   %   2   ==   0  ):   sum  [  i   +   1  ]  .  e_sum   =   (  sum  [  i  ]  .  e_sum   +   int  (  x  [  i  ]))   sum  [  i   +   1  ]  .  o_sum   =   sum  [  i  ]  .  o_sum   else  :   sum  [  i   +   1  ]  .  o_sum   =   (  sum  [  i  ]  .  o_sum   +   int  (  x  [  i  ]))   sum  [  i   +   1  ]  .  e_sum   =   sum  [  i  ]  .  e_sum   # This function receives l and r representing   # the indices and prints the required output   def   query  (  l     r  ):   diff   =   ((  sum  [  r   +   1  ]  .  e_sum   -   sum  [  r   +   1  ]  .  o_sum  )   -   (  sum  [  l  ]  .  e_sum   -   sum  [  l  ]  .  o_sum  ))   if   (  diff   %   11   ==   0  ):   return   True   else  :   return   False   # Driver code   if   __name__  ==  '__main__'  :   s   =   '122164154695'   preCompute  (  s  )   print  (  1   if   query  (  0     3  )   else   0  )   print  (  1   if   query  (  1     2  )   else   0  )   print  (  1   if   query  (  5     9  )   else   0  )   print  (  1   if   query  (  0     11  )   else   0  )   # This code is contributed by rutvik_56   
C#
   // C# program to check    // divisibility by 11 in   // subStrings of a number String   using     System  ;   class     GFG  {       static     int     MAX     =     1000005  ;       // To store sums of even    // and odd digits    public     class     OddEvenSums   {      // Sum of even placed digits      public     int     e_sum  ;      // Sum of odd placed digits      public     int     o_sum  ;   };       // Auxiliary array   static     OddEvenSums     []  sum     =         new     OddEvenSums  [  MAX  ];       // Utility function to    // evaluate a character's   // integer value   static     int     toInt  (  char     x  )   {      return     x     -     48  ;   }       // This function receives the    // String representation of the    // number and precomputes the sum array   static     void     preCompute  (  String     x  )   {      // Initialize everb      sum  [  0  ].  e_sum     =     sum  [  0  ].  o_sum     =     0  ;      // Add the respective digits       // depending on whether they're      // even indexed or odd indexed      for     (  int     i     =     0  ;     i      <     x  .  Length  ;     i  ++  )      {      if     (  i     %     2     ==     0  )      {      sum  [  i     +     1  ].  e_sum     =     sum  [  i  ].  e_sum     +         toInt  (  x  [  i  ]);      sum  [  i     +     1  ].  o_sum     =     sum  [  i  ].  o_sum  ;      }      else      {      sum  [  i     +     1  ].  o_sum     =     sum  [  i  ].  o_sum     +         toInt  (  x  [  i  ]);      sum  [  i     +     1  ].  e_sum     =     sum  [  i  ].  e_sum  ;      }      }   }       // This function receives l and r    // representing the indices and    // prints the required output   static     bool     query  (  int     l       int     r  )   {      int     diff     =     (  sum  [  r     +     1  ].  e_sum     -         sum  [  r     +     1  ].  o_sum  )     -      (  sum  [  l  ].  e_sum     -         sum  [  l  ].  o_sum  );      return     (  diff     %     11     ==     0  );   }       // Driver function to check the program   public     static     void     Main  (  String  []     args  )   {      for     (  int     i     =     0  ;     i      <     MAX  ;     i  ++  )         {      sum  [  i  ]     =     new     OddEvenSums  ();      }          String     s     =     '122164154695'  ;      preCompute  (  s  );      Console  .  WriteLine  (  query  (  0       3  )     ?     1     :     0  );      Console  .  WriteLine  (  query  (  1       2  )     ?     1     :     0  );      Console  .  WriteLine  (  query  (  5       9  )     ?     1     :     0  );      Console  .  WriteLine  (  query  (  0       11  )     ?     1     :     0  );   }   }   // This code is contributed by gauravrajput1    
JavaScript
    <  script  >   // Javascript program to check divisibility by 11 in   // subStrings of a number String   let     MAX     =     1000005  ;   // To store sums of even and odd digits   class     OddEvenSums   {      constructor  ()      {      this  .  e_sum     =     0  ;      this  .  o_sum     =     0  ;          }   }   // Auxiliary array   let     sum     =     new     Array  (  MAX  );   // Utility function to evaluate a character's   // integer value   function     toInt  (  x  )   {      return     x  .  charCodeAt  (  0  )     -     48  ;   }   // This function receives the String representation   // of the number and precomputes the sum array   function     preCompute  (  x  )   {      // Initialize everb      sum  [  0  ].  e_sum     =     sum  [  0  ].  o_sum     =     0  ;          // Add the respective digits depending on whether      // they're even indexed or odd indexed      for     (  let     i     =     0  ;     i      <     x  .  length  ;     i  ++  )      {      if     (  i     %     2     ==     0  )      {      sum  [  i     +     1  ].  e_sum     =     sum  [  i  ].  e_sum     +     parseInt  (  x  [  i  ]);      sum  [  i     +     1  ].  o_sum     =     sum  [  i  ].  o_sum  ;      }      else      {      sum  [  i     +     1  ].  o_sum     =     sum  [  i  ].  o_sum     +     parseInt  (  x  [  i  ]);      sum  [  i     +     1  ].  e_sum     =     sum  [  i  ].  e_sum  ;      }      }   }   // This function receives l and r representing   // the indices and prints the required output   function     query  (  l    r  )   {      let     diff     =     (  sum  [  r     +     1  ].  e_sum     -     sum  [  r     +     1  ].  o_sum  )     -      (  sum  [  l  ].  e_sum     -     sum  [  l  ].  o_sum  );          return     (  diff     %     11     ==     0  );   }   // driver function to check the program   for     (  let     i     =     0  ;     i      <     MAX  ;     i  ++  )     {      sum  [  i  ]     =     new     OddEvenSums  ();   }   let     s     =     '122164154695'  ;   preCompute  (  s  );   document  .  write  ((  query  (  0       3  )     ?     1     :     0  )  +  '  
'
); document . write (( query ( 1 2 ) ? 1 : 0 ) + '
'
); document . write (( query ( 5 9 ) ? 1 : 0 ) + '
'
); document . write (( query ( 0 11 ) ? 1 : 0 ) + '
'
); // This code is contributed by unknown2108 < /script>

Produktion:   

1 1 0 1