我代码的关键是存储下标.如果bm中的元素fn中都有且只出现一次,可得possible;如果bm中的元素fn中都有但有fn中有出现两次的,可判断ambiguity;如果bm中的元素有fn中没有的,可判断impossible。
#include<stdio.h>
#include<string.h>
int bum[100010],fum[100010],aum[100010][2];
int main() {
int f,b;
while(scanf("%d %d",&f,&b)!=EOF) {
memset(bum,0,sizeof(bum));
memset(bum,0,sizeof(fum));
memset(aum,0,sizeof(aum));
for(int l=1; l<=f; l++) {
scanf("%d",&fum[l]);
if(aum[fum[l]][0]) { //如果前面出现过相同的fum元素,
//则标记此下标,因为有两个下标表示同一个数
aum[fum[l]][1]=1;
}
aum[fum[l]][0]=l;
}
int m=0;
for(int l=1; l<=b; l++) {
scanf("%d",&bum[l]);
if(m==1)
continue;
if(!aum[bum[l]][0])
m=1;
if(aum[bum[l]][0]&&aum[bum[l]][1])
m=2;
}
if(m==1)
printf("Impossible\n");
if(m==2)
printf("Ambiguity\n");
if(m==0) {
printf("Possible\n");
for(int l=1; l<=b; l++) {
if(l<b)
printf("%d ",aum[bum[l]][0]);
else
printf("%d\n",aum[bum[l]][0]);
}
}
}
return 0;
}