Problem Statement
The suffix array of a string S is defined as the permutation of suffix numbers that corresponds to their lexicographic order. For example, suppose that S="abca". If we order all suffixes of S lexicographically, we get the following: "a" < "abca" < "bca" < "ca". The corresponding suffix numbers are 3, 0, 1, and 2, in this order. Thus, for this string S the suffix array would be {3, 0, 1, 2}. Note that the length of a suffix array is the same as the length of the original string.
You are given a
Definition
- Class:
- SuffixArrayDiv1
- Method:
- minimalCharacters
- Parameters:
- int[]
- Returns:
- int
- Method signature:
- int minimalCharacters(int[] SA)
- (be sure your method is public)
Notes
- We do not consider any specific alphabet. In particular, it is possible to have more than 26 different letters.
- For any suffix array, there is at least one string with such a suffix array, so the return value is always defined.
- The string A is smaller than a different string B in lexicographic order either if A is a prefix of B, or if there are indices where A and B differ, and for the smallest such index i we have A[i] < B[i].
Constraints
- SA will contain between 1 and 50 elements, inclusive.
- SA will be a permutation of 0 to |SA|-1, inclusive.
Examples
{3,0,1,2}
Returns: 2
As we saw in the problem statement, the suffix array {3,0,1,2} corresponds to the string "abca". However, there are also other string with the same suffix array. For example, the string "xxyx" also has this property, and contains only two different characters.
{3,2,1,0}
Returns: 1
One optimal string is "aaaa".
{0,1,2,3}
Returns: 2
Here, one optimal string is "aaaz".
{7,4,8,6,1,5,2,9,3,0}
Returns: 4
{0}
Returns: 1
{18,0,1,11,16,6,3,4,26,5,24,2,12,9,17,27,19,7,28,14,15,22,20,25,10,21,13,8,23}
Returns: 15
{0,9,18,22,33,35,8,4,11,12,5,30,26,21,1,14,16,24,28,25,2,19,34,20,27,10,29,15,31,6,23,17,3,7,13,32}
Returns: 19
{23,16,30,15,8,4,21,14,11,3,9,20,19,5,18,17,31,12,29,32,10,1,24,28,22,25,7,0,2,13,27,26,6}
Returns: 16
{12,22,20,21,11,3,8,1,4,15,6,18,7,0,9,16,13,19,10,2,17,14,5}
Returns: 9
{11,19,17,30,6,31,29,23,16,14,41,27,21,34,38,8,28,13,1,2,24,3,4,33,5,15,12,36,20,10,32,26,0,9,39,40,7,18,22,35,25,37}
Returns: 18
{6,18,42,38,33,37,40,26,24,43,13,31,34,32,7,25,21,29,20,10,30,3,8,9,4,11,12,1,41,17,19,22,2,23,39,16,5,14,27,0,36,28,35,15}
Returns: 26
{8,3,9,12,13,7,14,6,4,5,0,2,10,11,1,15}
Returns: 8
{9,38,3,24,44,21,39,8,36,18,16,10,33,6,32,43,19,20,27,7,45,13,14,42,2,37,35,34,17,26,4,41,5,11,1,29,22,15,25,31,12,40,30,0,23,28}
Returns: 23
{31,15,4,26,6,0,33,21,1,28,23,42,17,13,22,5,24,25,45,30,19,20,3,38,7,11,35,39,14,44,37,27,2,18,43,34,10,9,29,40,16,32,36,12,8,41}
Returns: 28
{23,8,29,26,27,2,30,24,28,0,32,15,5,14,3,19,12,1,6,22,13,7,31,25,16,21,18,20,11,9,17,10,4}
Returns: 18
{6,11,36,31,12,2,19,10,15,25,3,32,9,7,5,22,26,14,18,23,27,0,24,13,28,17,35,34,20,16,8,30,21,4,29,33,1}
Returns: 19
{42,32,19,28,34,31,2,21,12,29,17,36,35,5,10,26,20,14,37,8,30,39,11,27,44,6,38,18,23,15,24,22,3,0,7,1,25,13,40,16,43,4,33,41,9}
Returns: 26
{14,4,11,13,21,19,5,3,0,18,15,7,17,9,10,20,8,12,1,2,16,6}
Returns: 12
{1,2,0}
Returns: 2
{2,12,15,13,14,0,9,3,10,11,8,4,1,5,7,6}
Returns: 9
{8,7,6,3,13,4,0,11,1,10,9,2,12,14,5}
Returns: 7
{8,13,3,1,7,11,2,12,4,6,5,9,10,0}
Returns: 9
{0,1}
Returns: 2
{49,15,10,9,43,12,26,8,36,23,47,46,35,44,29,18,28,0,31,17,45,39,27,32,16,22,34,3,33,20,21,41,40,11,13,42,7,24,37,14,25,48,1,30,6,5,19,2,4,38}
Returns: 25
{1,2,0}
Returns: 2
{28,36,30,20,35,17,24,0,27,31,34,26,11,13,16,33,32,10,7,8,4,22,12,5,14,15,21,19,25,1,3,2,18,6,23,37,29,9}
Returns: 19
{23,21,18,17,14,20,12,34,0,33,25,5,13,36,10,37,30,6,9,32,22,7,15,24,11,28,29,31,27,1,26,3,35,4,16,8,19,2}
Returns: 22
{4,5,8,6,2,9,1,3,7,0}
Returns: 4
{2,4,0,1,3,5}
Returns: 4
{17,10,20,9,28,27,14,6,16,1,21,2,4,24,7,11,26,3,0,29,23,12,15,22,19,5,25,8,18,13}
Returns: 16
{3,2,5,0,1,4}
Returns: 4
{29,36,2,19,25,6,26,31,15,24,22,10,11,34,28,39,1,4,30,17,40,41,14,0,12,13,35,37,21,9,5,23,8,16,33,20,27,38,18,7,3,42,32}
Returns: 22
{1,0}
Returns: 1
{14,12,9,4,19,15,0,16,10,1,13,17,7,11,5,18,6,3,8,2}
Returns: 8
{14,12,11,3,2,21,16,17,0,22,18,4,10,13,9,8,24,1,5,7,20,25,23,6,15,19}
Returns: 13
{12,9,8,10,7,16,0,18,4,3,2,6,15,14,1,11,13,17,5}
Returns: 11
{2,1,3,0}
Returns: 3
{10,4,11,19,7,18,17,6,24,8,16,5,15,12,9,14,23,22,0,13,1,2,21,3,20}
Returns: 11
{43,23,4,6,31,37,9,21,0,2,29,30,15,20,10,36,11,12,8,24,40,28,39,5,16,7,32,13,22,33,38,34,17,35,26,41,18,1,27,25,19,14,42,3}
Returns: 19
{21,13,29,25,22,16,18,6,15,17,7,38,9,36,37,34,5,14,23,12,26,3,30,0,1,2,33,24,8,19,28,27,4,35,20,39,31,32,10,11}
Returns: 21
{10,14,20,3,21,11,2,13,8,0,9,1,6,18,4,17,23,15,19,12,26,22,5,24,7,25,16}
Returns: 13
{24,29,23,32,5,9,10,14,25,28,0,11,3,7,22,27,15,20,1,12,31,6,8,26,13,30,4,2,21,17,18,16,19}
Returns: 16
{40,20,23,1,43,7,17,14,25,6,16,15,24,38,18,48,2,41,36,19,26,33,27,45,37,4,21,5,28,31,30,22,10,42,29,9,34,44,49,13,39,32,0,46,11,47,8,35,12,3}
Returns: 23
{29,9,12,1,23,21,27,2,0,16,18,24,19,17,11,34,5,7,28,22,8,6,15,13,4,10,20,26,3,25,33,30,31,14,32}
Returns: 20
{4,10,18,2,17,9,16,0,8,6,7,3,11,14,5,13,1,12,15}
Returns: 11
{2,41,8,15,7,1,39,9,36,30,20,16,6,31,19,23,27,42,38,22,4,24,34,0,14,13,5,33,32,12,10,28,25,35,29,11,37,18,17,3,40,26,21}
Returns: 21
{19,21,3,0,9,14,17,12,18,2,23,1,8,5,16,11,22,4,20,6,24,15,7,13,10}
Returns: 13
{1,18,10,4,21,0,31,9,5,36,22,43,39,32,3,28,16,17,41,42,20,33,14,23,2,8,15,38,44,27,24,26,25,29,34,13,7,40,12,19,30,45,11,6,37,35}
Returns: 25
{15,26,24,2,34,23,4,0,20,22,27,44,8,1,16,25,40,14,5,3,28,11,37,41,30,32,12,9,42,38,43,46,18,6,35,7,31,21,10,36,33,39,17,19,29,13,45}
Returns: 22
{23,27,18,25,16,15,7,13,22,14,24,4,20,5,31,32,3,12,28,0,11,6,17,1,30,10,26,9,29,33,2,21,19,8}
Returns: 20
{19,0,5,9,17,4,10,14,2,1,12,18,7,15,16,6,8,11,3,13}
Returns: 10
{13,23,16,6,10,14,15,2,5,0,11,1,7,22,4,19,8,3,17,24,21,12,9,20,18}
Returns: 14
{14,3,0,17,13,2,16,5,11,4,9,15,6,19,18,10,8,12,7,1,20}
Returns: 11
{10,8,15,0,3,6,13,4,9,2,11,7,5,1,14,12}
Returns: 8
{0,13,4,8,20,17,21,11,26,6,25,18,14,9,24,12,2,15,19,1,7,22,3,10,5,23,16}
Returns: 14
{24,34,17,8,33,14,13,2,25,40,1,35,10,30,27,26,38,22,29,11,31,15,20,18,28,7,0,4,12,6,39,21,16,41,32,3,37,5,19,42,36,9,23}
Returns: 21
{32,47,42,30,6,16,35,27,25,26,28,14,37,0,33,39,20,7,34,22,21,5,18,10,4,46,17,40,41,24,3,43,38,29,31,1,19,23,2,44,8,11,9,12,45,36,15,13}
Returns: 24
{7,2,11,3,12,0,10,6,1,5,8,14,13,4,9}
Returns: 9
{1,2,0}
Returns: 2
{6,12,3,0,5,2,10,9,1,4,11,8,7}
Returns: 8
{18,8,7,9,11,3,12,0,16,10,5,15,14,13,1,6,2,17,4}
Returns: 8
{15,29,44,40,34,41,2,16,24,43,42,10,22,14,31,32,23,0,13,19,26,47,38,28,3,20,6,12,36,7,8,27,5,9,21,17,25,33,1,39,30,11,45,18,35,37,46,4}
Returns: 22
{6,1,21,26,25,2,0,24,4,13,9,11,16,12,7,10,19,22,8,14,3,15,20,18,23,5,17}
Returns: 14
{9,0,10,2,3,4,7,8,1,6,5}
Returns: 4
{40,6,20,41,42,17,1,29,2,8,44,9,15,7,0,31,28,21,39,23,3,10,19,38,11,27,18,37,4,33,32,24,16,22,35,25,13,36,34,30,43,14,26,12,5}
Returns: 23
{1,4,0,2,3}
Returns: 3
{10,2,7,0,8,1,5,3,6,9,4}
Returns: 5
{1,3,4,10,11,9,12,2,8,5,6,0,7}
Returns: 6
{9,15,16,3,14,13,0,22,6,1,17,20,7,5,18,2,10,23,21,4,11,8,19,12}
Returns: 10
{14,3,24,12,11,5,16,7,10,25,9,21,1,20,0,18,22,15,13,8,23,4,17,26,6,2,19}
Returns: 14
{7,6,25,12,9,8,1,0,27,14,11,20,3,10,21,5,4,16,18,17,24,29,23,13,28,19,2,22,26,15}
Returns: 15
{5,3,1,4,0,2,6}
Returns: 5
{5,17,13,12,1,8,15,6,16,7,19,4,18,21,14,10,11,9,20,0,2,3}
Returns: 11
{2,0,5,6,1,4,3}
Returns: 4
{10,1,2,8,5,3,6,9,7,4,0}
Returns: 5
{7,16,10,22,6,12,24,15,14,20,5,9,11,3,0,18,1,8,4,17,13,23,19,2,21}
Returns: 12
{7,15,13,16,12,11,10,14,6,3,2,1,5,17,18,9,0,19,8,4}
Returns: 10
{36,39,5,33,19,7,43,21,0,26,23,22,15,14,30,42,35,4,31,38,27,9,18,28,37,12,29,34,6,24,8,3,32,41,25,1,13,20,16,40,11,17,10,2}
Returns: 25
{3,5,2,1,0,4}
Returns: 3
{12,25,34,9,16,36,3,49,18,35,43,8,17,28,19,14,48,41,15,32,11,40,24,44,46,27,31,26,2,30,13,23,1,6,39,5,22,21,10,38,45,33,29,0,7,37,47,42,4,20}
Returns: 23
{23,16,9,4,24,6,0,12,13,1,11,20,14,19,22,21,7,5,2,17,8,25,3,18,10,15}
Returns: 13
{2,1,3,14,4,9,12,13,15,0,6,17,8,10,16,7,11,5}
Returns: 9
{8,0,1,6,2,7,5,4,3}
Returns: 2
{38,1,28,40,19,9,13,26,6,31,29,16,8,0,7,11,23,5,4,3,36,41,32,42,22,33,43,12,18,34,27,39,30,17,37,20,25,14,10,21,24,15,35,2}
Returns: 18
{0}
Returns: 1
{17,30,31,39,29,8,19,40,18,10,14,7,5,20,0,3,33,23,41,37,22,26,6,1,4,28,11,16,36,12,25,32,24,27,15,13,38,35,34,9,21,2}
Returns: 22
{1,0}
Returns: 1
{27,17,34,21,5,7,6,37,30,0,36,18,4,25,29,10,41,23,3,2,1,39,16,19,9,13,22,12,32,35,11,14,26,28,31,38,20,24,33,8,40,15}
Returns: 21
{38,28,18,21,49,14,36,20,45,25,15,32,2,43,46,5,22,27,11,26,44,42,13,19,12,4,16,24,48,3,9,30,47,7,1,17,40,34,29,37,31,23,41,10,33,6,39,35,0,8}
Returns: 27
{1,11,6,15,7,14,2,8,17,3,4,16,13,10,5,9,18,12,0}
Returns: 10
{17,12,2,6,11,7,19,20,0,4,1,10,9,23,21,22,16,13,3,18,8,15,5,14}
Returns: 13
{15,24,12,22,11,20,4,17,8,10,2,25,13,0,23,3,18,16,9,1,6,19,5,7,14,21}
Returns: 13
{11,9,7,4,6,3,0,8,5,10,1,2}
Returns: 6
{8,18,16,1,13,3,9,22,19,14,11,15,7,12,6,21,4,20,10,2,0,17,5}
Returns: 13
{17,7,18,21,2,0,15,1,12,3,11,4,14,9,10,5,13,16,6,19,8,20}
Returns: 13
{37,11,6,32,7,0,34,18,19,29,2,9,27,33,23,22,15,36,31,35,13,12,16,17,3,28,5,4,10,25,8,30,14,24,1,21,20,26}
Returns: 19
{20,23,25,8,17,24,14,5,30,15,18,1,27,21,4,19,10,11,28,6,7,3,26,13,2,22,0,12,29,16,9}
Returns: 16
{2,1,0}
Returns: 1
{0,11,1,5,3,7,15,12,9,14,17,16,4,13,10,2,8,6,18}
Returns: 9
{5,9,18,7,37,17,11,32,25,3,34,28,20,29,0,1,23,41,33,40,19,14,13,21,36,30,8,22,24,42,12,4,6,10,15,16,43,26,31,35,38,39,2,27}
Returns: 21
{7,23,40,18,39,24,33,15,19,16,4,20,34,35,12,28,5,43,41,38,14,46,13,3,26,6,30,0,1,8,29,17,22,42,11,36,27,45,32,25,9,37,31,2,10,44,21}
Returns: 26
{23,25,19,16,7,28,27,18,9,26,24,1,15,13,21,2,4,10,20,22,12,5,6,14,29,0,3,8,17,11}
Returns: 17
{11,5,13,8,9,6,1,3,2,4,7,0,12,10}
Returns: 9
{6,31,14,17,22,35,12,9,34,8,15,16,11,27,21,18,19,0,13,32,24,29,28,23,33,10,36,20,3,4,30,2,37,25,5,26,1,7}
Returns: 17
{1,2,0}
Returns: 2
{4, 28, 11, 15, 24, 35, 17, 36, 26, 48, 33, 39, 19, 2, 47, 49, 25, 18, 32, 40, 5, 21, 7, 12, 14, 42, 27, 6, 45, 44, 30, 38, 13, 37, 3, 16, 29, 43, 9, 22, 8, 23, 20, 34, 1, 10, 31, 0, 46, 41 }
Returns: 25
{35, 15, 16, 17, 0, 18, 1, 19, 2, 30, 20, 3, 6, 31, 26, 21, 13, 4, 11, 9, 7, 32, 27, 22, 34, 14, 29, 5, 25, 12, 10, 8, 33, 28, 24, 23 }
Returns: 2
{31, 12, 9, 28, 7, 16, 45, 3, 27, 26, 44, 30, 18, 37, 13, 24, 20, 39, 8, 35, 47, 0, 34, 23, 19, 32, 40, 43, 2, 29, 10, 5, 49, 25, 17, 46, 21, 48, 15, 42, 14, 33, 38, 6, 1, 41, 36, 22, 4, 11 }
Returns: 25
{24, 30, 45, 2, 41, 3, 40, 13, 14, 37, 42, 1, 0, 36, 28, 47, 22, 32, 44, 46, 16, 43, 21, 49, 29, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 17, 18, 19, 20, 23, 25, 26, 27, 31, 33, 34, 35, 38, 39, 48 }
Returns: 18
{19, 20, 23, 18, 35, 15, 26, 46, 40, 49, 21, 34, 45, 36, 13, 5, 39, 41, 48, 31, 7, 47, 33, 43, 29, 17, 32, 1, 16, 0, 37, 11, 28, 27, 42, 24, 22, 30, 2, 14, 25, 38, 10, 4, 8, 6, 12, 3, 44, 9 }
Returns: 21
{23, 34, 41, 1, 36, 19, 2, 49, 11, 24, 27, 30, 22, 15, 12, 25, 5, 16, 26, 28, 14, 45, 38, 39, 33, 9, 0, 42, 43, 40, 44, 8, 21, 47, 31, 29, 13, 7, 17, 3, 46, 20, 37, 18, 32, 48, 35, 6, 10, 4 }
Returns: 25
{3, 0, 1, 2, 4 }
Returns: 4
{2, 3, 0, 4, 1 }
Returns: 2
{29, 49, 1, 46, 17, 21, 36, 14, 48, 30, 35, 10, 34, 6, 15, 11, 2, 41, 23, 16, 39, 31, 8, 20, 43, 12, 5, 40, 38, 26, 45, 22, 3, 27, 47, 0, 25, 9, 13, 4, 24, 32, 44, 28, 33, 18, 42, 37, 19, 7 }
Returns: 24
{7, 8, 9, 6, 5, 4, 1, 2, 3, 12, 11, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 0 }
Returns: 5
{12, 1, 9, 49, 0, 27, 36, 31, 29, 45, 18, 46, 32, 40, 23, 33, 26, 41, 48, 17, 8, 47, 22, 34, 30, 7, 6, 11, 5, 4, 2, 21, 42, 35, 10, 39, 25, 3, 43, 16, 38, 37, 14, 13, 24, 15, 28, 19, 20, 44 }
Returns: 24
{1, 0, 2 }
Returns: 3
{4, 1, 5, 2, 0, 3, 6 }
Returns: 5
{0, 2, 3, 1 }
Returns: 3
{35, 19, 6, 47, 31, 3, 5, 4, 28, 12, 25, 30, 34, 0, 40, 42, 16, 46, 18, 36, 39, 26, 13, 33, 23, 22, 24, 37, 48, 21, 17, 15, 10, 49, 43, 14, 27, 11, 8, 7, 32, 9, 20, 1, 2, 44, 29, 38, 45, 41 }
Returns: 32
{3, 0, 1, 2 }
Returns: 2