0w1

JOI 11 本選 Card Game is Fun ( Adhoc )

Card Game is Fun | Aizu Online Judge
Aに対して全てのindexからすぐに次の数字にジャンプできる様にする、O( a ^ 2 )。そうするとBでどこから始めるのか枚挙し、いちいちどこまでいけるかをクエリしてもO( a * b )になる。

#include <bits/stdc++.h>
using namespace std;
const int MAXA = 5000 + 5;
const int MAXB = 5000 + 5;
const int MAXNUM = 1000 + 1;

int n, m;
int a[ MAXA ];
int b[ MAXB ];

int nxt[ MAXA ][ MAXNUM ];

int getMaxlen(int s){
    int cnt = 0;
    int pa = 0; // pointer in a
    for(int i = s; i <= m; ++i){
        pa = nxt[ pa ][ b[ i ] ];
        if( pa == 0 ) break;
        ++cnt;
    }
    return cnt;
}

void solve(){
    for(int i = n; i >= 1; --i)
        for(int j = i - 1; j >= 0; --j){
            nxt[ j ][ a[ i ] ] = i;
            // printf("nxt[ %d ][ %d ] = %d\n", j, a[ i ], i);
        }
    int ans = 0;
    for(int i = 1; i <= m; ++i){ // start from i
        ans = max( ans, getMaxlen( i ) );
    }
    printf("%d\n", ans);
}

int main(){
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; ++i)
        scanf("%d", &a[ i ]);
    for(int i = 1; i <= m; ++i)
        scanf("%d", &b[ i ]);
    solve();
    return 0;
}