Liar
Contest: Codeforces Round 422 (Div. 2)
Difficulty rating: 2400
Tags: binary search, dp, hashing, string suffix structures

The first semester ended. You know, after the end of the first semester the holidays begin. On holidays Noora decided to return to Vičkopolis. As a modest souvenir for Leha, she brought a sausage of length m from Pavlopolis. Everyone knows that any sausage can be represented as a string of lowercase English letters, the length of which is equal to the length of the sausage.

Leha was very pleased with the gift and immediately ate the sausage. But then he realized that it was a quite tactless act, because the sausage was a souvenir! So the hacker immediately went to the butcher shop. Unfortunately, there was only another sausage of length n in the shop. However Leha was not upset and bought this sausage. After coming home, he decided to cut the purchased sausage into several pieces and number the pieces starting from 1 from left to right. Then he wants to select several pieces and glue them together so that the obtained sausage is equal to the sausage that Noora gave. But the hacker can glue two pieces together only when the number of the left piece is less than the number of the right piece. Besides he knows that if he glues more than x pieces, Noora will notice that he has falsified souvenir sausage and will be very upset. Of course Leha doesn’t want to upset the girl. The hacker asks you to find out whether he is able to cut the sausage he bought, and then glue some of the pieces so that Noora doesn't notice anything.

Formally, you are given two strings s and t. The length of the string s is n, the length of the string t is m. It is required to select several pairwise non-intersecting substrings from s, so that their concatenation in the same order as these substrings appear in s, is equal to the string t. Denote by f(s, t) the minimal number of substrings to be chosen so that their concatenation is equal to the string t. If it is impossible to choose such substrings, then f(s, t) = ∞. Leha really wants to know whether it’s true that f(s, t) ≤ x.

Input format:
The first line contains single integer n (1 ≤ n ≤ 105) — length of sausage bought by Leha, i.e. the length of the string s.

The second line contains string s of the length n consisting of lowercase English letters.

The third line contains single integer m (1 ≤ m ≤ n) — length of sausage bought by Noora, i.e. the length of the string t.

The fourth line contains string t of the length m consisting of lowercase English letters.

The fifth line contains single integer x (1 ≤ x ≤ 30) — the maximum number of pieces of sausage that Leha can glue so that Noora doesn’t notice anything.

Output format:
In the only line print "YES" (without quotes), if Leha is able to succeed in creating new sausage so that Noora doesn't notice anything. Otherwise print "NO" (without quotes).

Constraints:
Time limit: 4.0 s
Memory limit: 256.0 MB

Note:
Let's consider the first sample.

In the optimal answer, Leha should cut the sausage he bought in the following way: hloyaygrt = h + loy + a + y + g + rt. Then he numbers received parts from 1 to 6:

- h — number 1
- loy — number 2
- a — number 3
- y — number 4
- g — number 5
- rt — number 6

Hereupon the hacker should glue the parts with numbers 2, 4 and 6 and get sausage loyygrt equal to one that is given by Noora. Thus, he will have to glue three pieces. Since x = 3 you should print "YES" (without quotes).

In the second sample both sausages coincide with sausages from the first sample. However since x = 2 you should print "NO" (without quotes).

Example input:
9
hloyaygrt
6
loyyrt
3

Example output:
YES

Example input:
9
hloyaygrt
6
loyyrt
2

Example output:
NO

Editorial:
Formally, you were given two strings s and t. Also number x was given. You need to determine whether condition f(s, t) ≤ x is satisfied. f(s, t) is equal to the minimal number of non-intersect substrings of string s which can be concatenated together to get t. Substrings should be concatenated in the same order they appear in s.
Note that for short strings we can use DP(prefS, prefT) = f(s[1... prefS], t[1... prefT]).
Note that we are not interested in such states in which value of DP is greater than x. Also note that we can swap DP value with one parameter to get new DP: G(prefS, cnt) = prefT, where cnt — value of old DP, prefT — maximal prefT for which condition is satisfied: DP(prefS, prefT) = cnt.
G have |s|·x states. But it's not clear how to make transitions to make total complexity smaller.
Note that there is only two transitions:
First transition is obviously, because we make prefix longer by one letter, i.e. s[1... prefS + 1] can be split into several parts to get prefix of string t, i.e. t[1... prefT].
Second transition is not so obviously, but if we take some part from string s to cover string t, it's easy to see that it's optimal to take the longest possible part. Length of such longest possible part is lcp = LongestCommonPrefix(s[prefS + 1... |s|], t[prefT + 1... |t|]).
We can find lcp using suffix array.
Total complexity is $${\mathcal O}(N\log N+Nx)$$, where N = |s| + |t|. But solutions with complexity $${\mathcal O}(N\log^{2}N+Nx)$$ also passed. Also lcp can be found by binary search with hashes. So the total complexity of such solution is $${\mathcal O}(N_{x}\log N)$$.