75 lines
1.7 KiB
C
75 lines
1.7 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
typedef struct {
|
|
int index, value;
|
|
} Pair;
|
|
|
|
int comparator(const void* a, const void* b) {
|
|
Pair* A = (Pair*)a;
|
|
Pair* B = (Pair*)b;
|
|
|
|
if(A->value == B->value) return A->index - B->index;
|
|
return B->value - A->value;
|
|
}
|
|
|
|
int main() {
|
|
int N;
|
|
scanf("%d",&N);
|
|
Pair* pair_A = (Pair*)malloc(sizeof(Pair)*N);
|
|
|
|
for(int i=0; i<N; i++) {
|
|
int value;
|
|
scanf("%d",&value);
|
|
Pair temp = {i, value};
|
|
pair_A[i] = temp;
|
|
}
|
|
|
|
qsort(pair_A, N, sizeof(Pair),comparator);
|
|
|
|
int M;
|
|
scanf("%d",&M);
|
|
Pair* pair_B = (Pair*)malloc(sizeof(Pair)*M);
|
|
|
|
for(int i=0; i<M; i++) {
|
|
int value;
|
|
scanf("%d",&value);
|
|
Pair temp = {i, value};
|
|
pair_B[i] = temp;
|
|
}
|
|
|
|
qsort(pair_B, M, sizeof(Pair), comparator);
|
|
|
|
int idxA = 0, idxB = 0;
|
|
int limitA = -1, limitB = -1;
|
|
int* subsequence = (int*)malloc(sizeof(int)*(M > N ? M : N));
|
|
int size = 0;
|
|
|
|
while(idxA < N && idxB < M) {
|
|
int posA = pair_A[idxA].index, valA = pair_A[idxA].value;
|
|
int posB = pair_B[idxB].index, valB = pair_B[idxB].value;
|
|
|
|
if(valA == valB) {
|
|
if(posA > limitA && posB > limitB) {
|
|
subsequence[size++] = valA;
|
|
idxA++; idxB++;
|
|
limitA = posA;
|
|
limitB = posB;
|
|
}
|
|
else if(posA <= limitA) idxA++;
|
|
else idxB++;
|
|
}
|
|
else if(valA > valB) idxA++;
|
|
else idxB++;
|
|
}
|
|
|
|
printf("%d\n",size);
|
|
for(int i=0; i<size; i++) printf("%d ",subsequence[i]);
|
|
printf("\n");
|
|
|
|
free(pair_A);
|
|
free(pair_B);
|
|
free(subsequence);
|
|
|
|
return 0;
|
|
} |