Problem Statement
There are N skyscrapers built in a row. The bases of all N skyscrapers all stand on one line that goes from the west to the east.
Each skyscraper has between 1 and N floors, inclusive. No two skyscrapers have the same number of floors.
An observer is looking at the row of skyscrapers from an observation point that is far to the west from all of them. For this observer, some skyscrapers are at least partially visible while others are completely invisible. More precisely, a skyscraper floor is visible to the observer if and only if no skyscraper to the west of this one has a floor of the same height.
Below is one sample scene. Arrows ("->") indicate the direction in which we look at the skyscrapers (west is on the left of the figure). There are seven skyscrapers, each shown as one column of 'X's and 'O's. Floors visible to the observer are shown as 'O', floors hidden behind other skyscrapers are shown as 'X'.
-> O -> O X -> O X X -> O X X X -> O X X X X -> O X X X X X -> O X X X X X X =============================
You are given the
For the sample scene shown above, visibility = "OXOXXOX".
In other words, visibility tells you what the scene with skyscrapers looks when viewed from above. For each skyscraper, from the left to the right, you are told whether its topmost floor is 'O' (visible from the west) or 'X' (hidden behind another skyscraper when looking from the west).
Count all permutations of skyscrapers that correspond to the given
Definition
- Class:
- SkyscraperCounting
- Method:
- count
- Parameters:
- String
- Returns:
- int
- Method signature:
- int count(String visibility)
- (be sure your method is public)
Constraints
- visibility will have between 1 and 100 characters, inclusive.
- Each character in visibility will be either 'O' or 'X'.
Examples
"OXXXX"
Returns: 24
We can deduce that the leftmost skyscraper must be the tallest one (5 floors). Each of the 4! = 24 orders of the other four skyscrapers works.
"OXOXXOX"
Returns: 72
This input corresponds to the figure in the problem statement. The skyscrapers shown in the figure have heights {3, 1, 5, 4, 2, 7, 6}, and this is one of the 72 permutations of heights that produce the given visibility pattern. Some of the other permutations with the same visibility pattern: {3, 1, 5, 2, 4, 7, 6} {2, 1, 5, 3, 4, 7, 6} {4, 3, 6, 5, 1, 7, 2}
"XOXOXO"
Returns: 0
No such permutations: the westmost skyscraper is always visible.
"OXXXXXXXXXXXXXO"
Returns: 227020758
Remember to compute the answer modulo 10^9 + 7.
"OXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Returns: 104379182
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
Returns: 1
"OXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXOXXO"
Returns: 105944501
"OXXXOX"
Returns: 30
"OXOOXO"
Returns: 4
"OOXXOO"
Returns: 6
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
Returns: 1
"XOOXOOOOOOOOOOOOOOOOOOOOOXOOOOOXOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOOOOOOOOOOOO"
Returns: 0
"OXOOOOOXOOOOOOOXOOOOOOOXOOOOOOOOOXOOOOOOOXOOOOOXOOOOOOOXOOOOOOOOOOXOOOOOOXXOOO"
Returns: 452093834
"OXOOOOXOOOXOXXXXOOXOOOOXOOXOOOOOXOXOOOOOOXOXOOOXOOXOOOOOOXXOOOOOOOXOOOO"
Returns: 205417843
"OOOOOOOOOOOOOOOXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
Returns: 15
"OXXOXXOXXXOOXXOOXXOXOXXXXXOOXXXOXOXXXOOXOOOOXOXXXOXOXOXXXXOOXXXOOXOOXXXXXXXXOXOXXXXOOXOXOOOXXXX"
Returns: 108987402
"OOOOOXXXXOOOOOXOOXOOXOOOOOOOXXXOOOXXOXXXXXOXOOOXOOOOOXOXOXOXOOOXOOOOOOXXOXOOOOOOOXXXXOOOXOOO"
Returns: 233382053
"OOOOOOOOOOOOOXXOOOXOXXOXOOOOOXOOOOOXOOOOOOOOOOOOXOOOOOOOOOOOXOOOXOOOXOO"
Returns: 158858636
"OXXOOOX"
Returns: 12
"OXXXXXXXXXXXXXXXXXXXXXXXXXXOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXOXXXXXXXXXXXXXXXXXXXX"
Returns: 228919597
"OOXXOXOOOOOOOOOXOOOOOOXOOXOOOOXOOXXOOOOOOOOOOOOOXOOOOOOOOOOXOOOXXOOOXXOOOOOOOOOXO"
Returns: 930492857
"OOXOXOOOOOOXOOOXOOOOOOOOXXOXXXOXOOOOXXOOOOXOOOOOOOOOXOXOOOXOXOXOOXOOOOOXXOOOOOO"
Returns: 477318963
"OOOXOO"
Returns: 3
"OXX"
Returns: 2
"OOOOXOOOOOOOOOOOOOOXOXOOOXOOOOOOOOXOOOOOOXOOOOOOXOOOOOOOOOOOOXOOOOOOOOOO"
Returns: 857115666
"X"
Returns: 0
"OXOOXOOOOOOOOXOOOOXXXXOOOXXOOOXOXOOXOOOOOOOOXOXXOOXOOOOXOXXXOOOOOOXOOOXXXOOOOOOOOOOXOOOXOXOOX"
Returns: 638640114
"XOOOXOOOOOOXXOOOOOXXXXOOOOOOXXOXOOOOXOXOOOOOXOXXOOXOXOOOXOOXOOXXXXOOOOOOO"
Returns: 0
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOOOOO"
Returns: 79
"OOXXXX"
Returns: 120
"OOOXOOOOXXOXOOXOOXXXXOOOOOOXXOOXXOOOXOXXOOOOOOOOOXXOOOOOOOOOOOOOOOOXOOOXXOOXOOXOOOOOXOOOOOO"
Returns: 231167027
"OXXOXXXXOOXOXXXXXXXOOXXXXXXOOXXOXXXXXXXOXXXXXOOXXXOOXXXXXXXXXXXXXXXXXOXXOOXXXXXOXXXOOOXXOXXX"
Returns: 374291117
"OOOXXXXOXOXXOXOOOXOXXXXOXOXXXOXXXXXXOXOXXXXXXXXXXXXOXOXXXXXXXXOOXXXOXOXXXOOOXXXOXOOXO"
Returns: 225151140
"OXXXXXXXXXXXXXOXXXOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXOXXXXXXXXXXXXXXXOXOXXXXXX"
Returns: 266289630
"OOOOOOOOOOOXOOOOOOXXOXXOOOOXOXXXOXOXOOOOXOOXXOOOOXXOOOOOOXOOOOOOOOOOOOXOOXO"
Returns: 500704093
"OXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXOXXOXXXXOXXXXXXXXXXOXXXXXXXXXXXXXXXXOXXXXXXXXXXXXOX"
Returns: 49025421
"OXXXXOOXXXOXXXOXXXXXXXOXXXOXXXXXXOXXXXXXOXXXXXXXXOOXXXXXXOXXXXXXOOXXOXXXXXXXOOXX"
Returns: 859978373
"OXXOXXXOXXXXOOXOXOOOXOXOOXOXXXOOXXXXXOXXOOOXXXOXXXXOOXXXOOXXOXXOXXXXXXXOXXXXXXOXXXX"
Returns: 853423337
"OOOOOOOXOOOOOOOOOOOOXOOOXXOOOOOXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOOOOOOOXOOOOOOOOOOO"
Returns: 371539909
"OOXXXXOOXOXOXOXOXOOXOOOOXOXOOOOXXXXXOOXOOOOXXXOOXXOXXXOXXOXXXXOXOOXXXXXXOOXXOOOX"
Returns: 822590313
"OOOOOXOOOOOOOXOXOXOXOOOOOOOXOXOOXOOOOOOXOOOXXOOOOOOXXOOOOXOOOOOOOOOXOOOOOOXO"
Returns: 142763330
"XOOXXXOOXOOOXOOXOOXXOXOXOOXXOOXOXOOOXOXXXXOXXXOXXXOXXXOOXXXOOOXXXOOOXOXXOXXOXXXOOXXO"
Returns: 0
"OOXOOXOXXXXXOXXXOOOOXXOXXXOXXXXXXXXXXOOOXOXXXXOOOOOXXXOOXOXXOXOXXOOXOOOOXOOOOXXOOOOXOXXXOOXOO"
Returns: 314219880
"OOXOXOX"
Returns: 48
"OXXXOXXXXXXOXOXOOXXOXXOXXXOXOXXXOOXXXOXXOXXXOXOXOXOXXXOXXXXXXXXXXXXXXXXOXOOOXXXXXXXXOXXOXXXXXOXX"
Returns: 310098171
"OOXXO"
Returns: 6
"OXOOXXOOOOOOOXOOXOOXOXOOOOOXOOXXXXXXOOOOOOXOOOOXOOOOXXOOOOOOXOOOOOOOOOXOXXOOOOXOOOOXOXOXOOOXOXOOXX"
Returns: 481185397
"OXXXXO"
Returns: 24
"XOOXOOOOXOOXOXXOOXXOXOXOOXXXXOXXXOXOXOXXXXXOXOXXXXXOOOXOOOOOOOXXXXOXXOOOXOOOOOOOXOXXOOOOO"
Returns: 0
"XOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
Returns: 0
"OXO"
Returns: 1
"OXOXOXXXXOXXXXXOXOXXXXXXXXXXXXOXXXXXXOXXXXXXXXXXXXXXXXXXXXXXXXXXOOXXXXXXXXXXXXXXOXXXXXXXXXXXXOXXX"
Returns: 561927869
"OOOOXXX"
Returns: 120
"OOXOOO"
Returns: 2
"OOOXXXXOOXOXXXOXXXXOOXXXOXOOOOXOXOXXXOXXXXXOXOXOOXOXXOOXOXXXXXXXOXOOXXOXXOOXOOOXOOO"
Returns: 100850489
"OXXXXXOOXOXXOOOOXXXXOXOXOXXOXOOXXOOOOXXXOOXXOXXOXXXXOOXOOXXXOOOOXOXXXXXOXXXOXOXOXXXXXX"
Returns: 68349499
"OOOOOOOXOXXOXXXXOOOOOOXOOXOOXXXOXOOOOOOXOOXXOOXXOOOOOXOXOXXOOOOXOOOXXOXOXOOXOOOOOXXXOO"
Returns: 330075457
"OOOOOOXOXOXOOOXOOXOOOXOOOOOXOOXXOOOOOOOXOXOXXOOOXXOOXOXOOXOOXOOXOOXOXOXXO"
Returns: 528383062
"OOOOOOOOOOOOOXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOOOOOOOOOOO"
Returns: 806
"OXXXOOXXXXXOOXOOXOOOOXOOOOXXOXXXXXOOOOOOOOOOOXXXXXXOXOOXXOXOOXXXOOOXOOOOXXOOOOXOOXOOOXOOOXOXOXOXOOO"
Returns: 898504613
"OXXOXXOXXXOOOOXOXOOXXXXOOOOXOXXXXXXOOOOOXXXXOOXOXOOXOOOOXOOOXOOXOXOOXXOXXXOX"
Returns: 219596409
"OXOOOXXOOXXXOOXXOXXOXOOXXXOOOOOOXOXOXOOXOOOOXXXOXOOOOOXOXOOXOXXXXOXOXOXXXXXOOXOOXXOX"
Returns: 606066226
"XXXXXXXOXXXXXXXXXXXXXXXXXXOXXXXXXXXXXXXXXXXXXXXOXXXXOXXXXXXXXXXXXXXXXXXXXOXXXXXXXXXX"
Returns: 0
"OOOXO"
Returns: 3
"OOXX"
Returns: 6
"OXXOXOXXXOOXXOOXXOXXXXXOOXXXOXXOXXXXXOOOOXOXXXXXOXOXXOOXXOXXXOXOXXXOXOXXXXXO"
Returns: 922297494
"OOOOOOOXOXOOOXOOXXXOOOOOOOXOOXXXXOXOXXXOOOOXXXOOOXOOXXOXOOXXOOOOXOOOOOOOXXXXXOXXO"
Returns: 161287357
"XOOOOOXOOXOOOXOOXOOOOOOOOOOOOOXXOOOOOOOOXOXOXOOOOOOOOOXOOXOOXOXOXOXOOOXOOOOXOOXOXXXXXOXOX"
Returns: 0
"OXXXXXXXXXXXXXXXXXOXXXXXXXXOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXOXXXXXXXXXXXXXXXXX"
Returns: 586060270
"OOOOX"
Returns: 4
"OXOXXOXXOXXXXXOOXXXXXXXXXXXXXOXXOOXXXXOXXXXXXXXXXXXXXXXXXXXXXOXXOXXOXXXXOXXXOXXXXXXXXXXXXXXXOXX"
Returns: 963682702
"OXXXOXOXXXXXXXXOOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXOOXXOOXXXXXXXXXXXXXXXXXXXXXX"
Returns: 460187880
"OOXOOXXXXXXXXXXXXXXOXXXXXOXXXXXXXXXXXXXXXXXXOXXXXXXOXXXXOXXXXXXXXXXXXXXXXXXXXXXXOOXXXXXXOXO"
Returns: 901717150
"OO"
Returns: 1
"XOOXOOOOOOOOOOOOXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOOOOOOOOOOOOOO"
Returns: 0
"OOO"
Returns: 1
"OX"
Returns: 1
"OOXXX"
Returns: 24
"OXOXXXOXXXOXXXXXXXXXXXOXXXXOOXXXXXXXXOXXXXXXOXOXOXXXXXXOXXXXXXXXXXXXOXXXX"
Returns: 882993412
"OOOXXXXXOXOOXXXXOOXOXXXXOXOXXOOOXOXOOOXXOXOXOOOOOXXXOOOXOXXOXXOOXXXXOXXOXOOOOXOOXXOOXXXXO"
Returns: 547898954
"OXOOOOOOOXOOOOOOXOOXOOXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOXOXOOOOOXXOOOOOOOOOOOOOOOOOOXOOOOOOXOXOX"
Returns: 963315912
"OXXOOOO"
Returns: 2
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOOOOOOOOOOOOOOOOOOOOXOOOXOOOOOXOOOOOOOOOXOOO"
Returns: 603727993
"XOXXOOXOOOOOOOOOOOXOXOOOOOXXOOXOXOOOOOOOOOXOOOOOOOOOXOOOOOOOOOOOOOOOOOOXOXOOOOOOOOXOXOOOXOOOOOOOOXO"
Returns: 0
"OOXXXOXXOOXXXOOOXXOXXOXXOXXXOXOOXXOOXXXOXXXXXXXXOXOOOXXXOOOXOXXXXOOXXXXXOXXXOOXXOXOOO"
Returns: 708837468
"XOOOOOOOOOXOOOOOOOXOOOOOXOOOOOOOOOXOOOOOOOXOOOOOOOOXOXOOOOXOOOOOOOOOOOOOOOOOOOOOOOOOO"
Returns: 0
"OOX"
Returns: 2
"OXOXXXXXOXXXXOOXXXOOXOXXXXXXOOXOOOXXXOOXOXXXXXXXOXXXXXXXOXXOXXXXOXXXOOXXXOOXXOOXXXXOXXXXXOXXOO"
Returns: 992645792
"OXOOOXOXOOOXOOOOOOOOOOOOXXOOOOXOOXOXXOOOOOXOXOOOOOOXOXXOXOXOXOXOOXOOXOOXXOXXOOOOXOOXOOOOOXXX"
Returns: 59971954
"O"
Returns: 1
"OXOOO"
Returns: 1
"OXXOXXXXOXOXXXXOXXXXXXXOXXXOXXXOXXXXXXOXOXOOXOOXXXXOXXOXXXXOXXXXXOXXXOXOXOXXXOXOXOXXOOOOXXOXXXXXXXOO"
Returns: 832368478
"OXXOXXO"
Returns: 40
"OXOXOXOXOXOXXOXOXOXOXOXXOXOXOXOXOXXOXOXOXOXOX"
Returns: 488912801
"OOXXXOXXXOXOXOXXOXOXXOXOOXXXXOXOXXXOOXOXXXXOOOXXXXOOOOXOOXXOXXOXOOXXOOOOXXOXXOOOXOOOXOOOOXXXXXXOOXO"
Returns: 509730714
"OXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX"
Returns: 196932377