#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; int m,n,ans,a[501],b[501],dp[501][501],pre[501][501],lcis[501]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); scanf("%d",&m); for(int i=1;i<=m;i++) scanf("%d",&b[i]); for(int i=1;i<=n;i++) { int k=0;//dp[i][k]为最长的前缀公共上升子序列 for(int j=1;j<=m;j++) { if(a[i]!=b[j]) dp[i][j]=dp[i-1][j]; if(a[i]>b[j]&&dp[i][j]>dp[i][k]) k=j; if(a[i]==b[j]) { dp[i][j]=dp[i][k]+1; pre[i][j]=k;//方便寻找dp[i][j]的前一位 } } } int x=n,y=0,cnt=0; for(int i=1;i<=m;i++) if(dp[n][i]>ans) { ans=dp[n][i]; y=i; } while(dp[x][y]) { if(a[x]!=b[y]) x--; else { lcis[ans-cnt]=b[y]; cnt++; y=pre[x][y];//表示回溯到推出dp[x][y]的上一位 } } printf("%d ",ans); for(int i=1;i<=ans;i++) printf("%d ",lcis[i]); printf(" "); return 0; }