AOJ 0572 たのしいカードゲーム

Bから新しい山を作るとき、下から取り除く分は考えずに、
上からn枚取り除いたときのことを考える。
この時できた新しい山とAとの最長の共通列?はO(N)で求まる。
よって全体としてはO(N^2)で計算できる。

#include <cstdio>
#include <algorithm>
using namespace std;

const int MAX_N = 5000;
int A, B;
int a[MAX_N], b[MAX_N];

int solve(int s){
	int i = s;
	int ret = 0;
	for(int j = 0; j < A; j++){
		if(i >= B) break;
		if(a[j] == b[i]){
			ret++;
			i++;
		}
	}
	return ret;
}
int main(){
	scanf("%d %d", &A, &B);
	for(int i = 0; i < A; i++)
		scanf("%d", a + i);
	for(int i = 0; i < B; i++)
		scanf("%d", b + i);
	int ans = 0;
	for(int i = 0; i < B; i++){
		ans  = max(ans, solve(i));
	}
	printf("%d\n", ans);
	return 0;
}