1 记录a中每个数出现的序号,和这个数出现的次数。再判断b里的数是不是都在a中出现过,不是就是不可能。全部出现且出现不止一次就是不确定的。
2 如果都只出现一次,依次输出与b相等的a中数的序号。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
int num,n;
}a[1000010];
int main()
{
int n,m;
int b[100010];
int ant[100010]={0};
int num1,num2;
while(~scanf("%d %d",&n,&m))
{
num1=0;
num2=0;
memset(ant,0,sizeof(ant));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].num);
a[a[i].num].n=i; //记录这个数的序号
ant[a[i].num]++; //记录每个数字出现的次数
}
for(int i=1;i<=m;i++)
{
scanf("%d",&b[i]);
if(ant[b[i]]==1) //num1,num2计数,没有出现时ant[i]==0不记下来
num1++;
else if(ant[b[i]]>1)
num2++;
}
if(num1+num2<m) //成立说明存在一个数在 f[i]中没有出现过,就是不可能
printf("Impossible\n");
else
{
if(num2>0)
printf("Ambiguity\n"); //一个数出现不止一次,就是不确定的
else
{
printf("Possible\n");
int z=m;
for(int i=1;i<=m;i++)
{
if(ant[b[i]]==1) //扫b[i]这个序列,出现一次输出a中与b相等值的序号
printf("%d",a[b[i]].n);
if(z>0)
{
printf(" ");
z--;
}
}
printf("\n");
}
}
}
return 0;
}