Solution


Approach #1 Brute force [Time Limit Exceeded]

Intuition

According to the question, we need to find such that is the largest subsequence that can be found in . is essentially and is and so, we can find the number of times repeats in , say . And the number of times repeats in is therefore . Simple.

Algorithm

  • Initialize and . represents the current index in to be checked against and represents the number of times repeats in .
  • Iterate over the variable from to :
    • Iterate over the variable from to :
      • If is equal to , increment .
      • If is equal to , this implies that has completed one repartition and hence set and increment the .
  • Return since, is .

Complexity Analysis

  • Time complexity: .

    • We iterate over the entire length of string for times.
  • Space complexity: extra space for and .


Approach #2 A better brute force [Accepted]

Intuition

In Approach #1, we simply checked for repetition over the entire . However, could be quiet large and thus, is inefficient to iterate over complete . We can take advantage of the fact that is repeating and hence, we could find a pattern of repetition of in . Once, we get the repetition pattern, we can easy calculate how many times the pattern repeats in in .

But what's the pattern!

In approach #1, we kept which tells the index to search in . We try to see in the below illustration if this repeats itself after some fixed iterations of or not and if so, then how can we leverage it.

Count the repitition

After finding the repitition pattern, we can calculate the sum of repeating pattern, part before repitition and part left after repitition as the result in .

But will this repitition always take place?

Yes! By Pigeonhole principle, which states that if items are put into containers, with , then at least one container must contain more than one item. So, according to this, we are sure to find 2 same after scanning at max blocks of .

Algorithm

  • Intialize nd , which are same as in Approach #1.
  • Initialize 2 arrays, say and of size , initialized with 0. The size is based on the Pigeonhole principle as discussed above. The 2 arrays specifies the and at the start of each block.
  • Iterate over from to :
    • Iterate over from to :
      • If , increment .
      • If is equal to , set and increment .
    • Set and
    • Iterate over from to :

      • If we find the repitition, i.e. current , we calculate the count for block before the repitition starts, the repeating block and the block left after repitition pattern, which can be calculated as:

      • Sum the 3 counts and return the sum divided by , since
      • If no repetition is found, return .

Complexity analysis

  • Time complexity: .

    • According to the Pigeonhole principle, we need to iterate over only times at max.
  • Space complexity: extra space for and string.


Analysis written by @abhinavbansal0.