题意:给你n个f,m个b,按照公式让你判断是否能决定a
思路:结果可以有三种:1.不能,此时,f中存在两个或两个以上的a相同。2.不确定,此时一个b对应多个f,3.确定
f[num]存储a应有的值,然后用b查询,注意不存在比不确定优先判断。。
总结:水题,不难想,读懂就能写了
ac代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stack>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#define MAXN 1000100
#define LL long long
#define ll __int64
#define INF 0xfffffff
#define mem(x) memset(x,0,sizeof(x))
#define PI acos(-1)
using namespace std;
int f[MAXN];
int a[MAXN],b[MAXN];
int main()
{
int n,m;
int i;
while(scanf("%d%d",&n,&m)!=EOF)
{
mem(f);
int num;
for(i=1;i<=n;i++)
{
scanf("%d",&num);
if(f[num])
f[num]=-1;
else
f[num]=i;
}
for(i=1;i<=m;i++)
scanf("%d",&b[i]);
int bz1=0,bz2=0,bz3=0;
for(i=1;i<=m;i++)
{
if(f[b[i]]==0)
bz1=1;
else if(f[b[i]]==-1)
bz2=1;
else
a[i]=f[b[i]];
}
if(bz1)
printf("Impossible\n");
else if(bz2)
printf("Ambiguity\n");
else
{
printf("Possible\n");
for(i=1;i<m;i++)
printf("%d ",a[i]);
printf("%d\n",a[i]);
}
}
return 0;
}