Pagini recente » Diferente pentru algoritmiada-2011/clasament/open intre reviziile 2 si 1 | Diferente pentru algoritmiada-2011/runda-finala intre reviziile 5 si 7 | Atasamentele paginii Profil DRGmen | Cod sursa (job #1970986) | Cod sursa (job #1451126)
#include <stdio.h>
#include <vector>
using namespace std;
int main()
{
freopen("cmlsc.in", "r", stdin);
freopen("cmlsc.out", "w", stdout);
std::vector<int> a, b, sol;
a.push_back(257);
b.push_back(257);
int i, j, val;
char m[1025][1025]={0};
int n, _m;
scanf("%d %d", &n, &_m);
for(i=1;i<=n;i++){
scanf("%d", &val);
a.push_back(val);
}
for(i=1;i<=_m;i++){
scanf("%d", &val);
b.push_back(val);
}
for(i=1;i<=n;i++)
for(j=1;j<=_m;j++)
if(a[i]==b[j])
m[i][j]=m[i-1][j-1]+1;
else if(m[i-1][j]>m[i][j-1])
m[i][j]=m[i-1][j];
else
m[i][j]=m[i][j-1];
for(i=n, j=_m; i && j;){
if(a[i]==b[j]){
sol.push_back(a[i]);
i--;
j--;
}
else if(m[i-1][j]>m[i][j-1])
i--;
else j--;
}
printf("%d\n", sol.size());
for(i=0;i<sol.size();i++)
printf("%d ", sol[i]);
}