我代码的关键是存储下标.如果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;
}

本文介绍了一种用于解决ACM编程竞赛中的特定问题的方法,通过存储下标来判断两个序列之间的关系,如可能(Possible)、模糊(Ambiguity)或不可能(Impossible)。这种方法能够有效地处理元素是否唯一对应的问题。
320

被折叠的 条评论
为什么被折叠?



