using
System;
using
System.Collections;
using
System.Collections.Generic;
class
GFG{
static
int
[,,] dp;
static
int
[] KMPArray;
static
int
m;
private
static
int
findSubsequence(
int
[] a,
int
[] sequence,
int
i,
int
prev,
int
k)
{
if
(k == m)
return
int
.MinValue;
if
(i == a.Length)
return
0;
if
(prev != -1 && dp[i, prev, k] != -1)
{
return
dp[i, prev, k];
}
int
include = 0;
if
(prev == -1 || a[i] >= a[prev])
{
int
k2 = k;
while
(k2 > 0 && a[i] != sequence[k2])
k2 = KMPArray[k2 - 1];
if
(a[i] == sequence[k2])
k2++;
include = 1 + findSubsequence(a, sequence,
i + 1, i, k2);
}
int
ans = Math.Max(include,
findSubsequence(a, sequence,
i + 1, prev, k));
if
(prev != -1)
{
dp[i, prev, k] = ans;
}
return
ans;
}
private
static
void
fillKMPArray(
int
[] pattern)
{
int
j = 0;
int
i = 1;
KMPArray[0] = 0;
while
(i < m)
{
if
(pattern[i] == pattern[j])
{
j++;
KMPArray[i] = j;
i++;
}
else
{
if
(j != 0)
j = KMPArray[j - 1];
else
{
KMPArray[i] = j;
i++;
}
}
}
}
static
void
printAnswer(
int
[] a,
int
[] sequence)
{
m = sequence.Length;
KMPArray =
new
int
[m];
fillKMPArray(sequence);
dp =
new
int
[a.Length, a.Length, a.Length];
for
(
int
i = 0; i < a.Length; i++)
for
(
int
j = 0; j < a.Length; j++)
for
(
int
k = 0; k < a.Length; k++)
dp[i, j, k] = -1;
int
ans = findSubsequence(a, sequence, 0, -1, 0);
Console.WriteLine((ans < 0) ? 0 : ans);
}
public
static
void
Main()
{
int
[] arr = { 5, 3, 9, 3, 4, 7 };
int
[] arr1 = { 3, 4 };
printAnswer(arr, arr1);
}
}