Editorial for COCI '14 Contest 1 #3 Piramida
Submitting an official solution before solving the problem yourself is a bannable offence.
Firstly, let us notice that changing the word direction from row to row doesn't have any impact on the number of individual letters in a certain row.
A naive solution would be to simulate writing the letters into each row and count the number of appearances of individual letters in the matrix and then output the value from the matrix for each query. The memory complexity of this solution is and time complexity , which is enough for of total points.
For a more effective solution, we need to examine how string looks written down in each row. There are two options:
- for some and . In other words, string is a substring of string .
- for some and . In other words, string consists of a suffix of string (possibly an empty one), then the whole word repeated times and, finally, a suffix of string (possibly an empty one)
For example, if the word would be , the row of the pyramid would be:
In order to determine , and for a certain row, we need to be able to determine what letter the word in that row begins with. It is easily shown that for row that position is equal to the remainder of dividing number with . It is necessary to carefully implement this formula because can be very big. When we have calculated the position, it is easy to determine parameters , and .
Now we can come up with the formulas for certain cases. Let be the number of appearances of letter of the alphabet in the substring . The formulas are the following:
To implement this solution effectively, we need to be able to quickly calculate the value of function . We can do this by constructing a matrix where the element at index tells us how many times the letter of the alphabet appears in the substring . Then we calculate by the formula .
The memory complexity of this solution is , and time complexity , which was enough for all the points in HONI.
In COCI, this solution was enough for of total points because the maximal string length was bigger, so a matrix of the dimension couldn't fit in 32 MB. It was necessary to solve queries separately for each letter. In this case, instead of a matrix of the dimension , a matrix of the dimension was enough.
Comments