#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);}
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1,class T2>inline void gmax(T1 &a,T2 b){if(b>a)a=b;}
template <class T1,class T2>inline void gmin(T1 &a,T2 b){if(b<a)a=b;}
const int N=1e5+10,M=0,Z=1e9+7,ms63=1061109567;
int casenum,casei;
int n,m;
int f[N];
int e[N];
int p[N];
int main()
{
while(~scanf("%d%d",&n,&m))
{
MS(e,0);
for(int i=1;i<=n;++i)
{
int x;scanf("%d",&x);
if(e[x]==0)e[x]=i;
else if(e[x]>0)e[x]=-1;
}
int ans=1;
for(int i=1;i<=m;++i)
{
int x;scanf("%d",&x);
if(ans==0)continue;
if(e[x]==0){ans=0;continue;}//Impossible
if(ans==-1)continue;
if(e[x]==-1){ans=-1;continue;}//Ambiguity
p[i]=e[x];
}
if(ans==0)puts("Impossible");
else if(ans==-1)puts("Ambiguity");
else
{
puts("Possible");
for(int i=1;i<=m;++i)printf("%d ",p[i]);
puts("");
}
}
return 0;
}
/*
【trick&&吐槽】
有些题,就是给你绕啊绕,我们要好好读题目,再理清思路,做起来就很简单了!
【题意】
这是理清后题意的版本——发现理清之后就是傻叉题啊!
给你一个表示映射关系的数组f[],元素个数为n(1e5),每个数的范围都在[1,n]。
给你一个映射之后的数列b[],元素个数为m(1e5),每个数的范围都在[1,n]。
对于b的每个位置的数b[i],都是由f[]某个位置的数生成的。
是哪个位置呢?记录为a[i]。
如果存在至少一个b[i],不能够生成,答案就是Impossible
否则,如果至少存在一个b[i],所对应的a[i]不唯一,那么答案就是Ambiguity
否则输出Possible和解。
【类型】
模拟
【分析】
按照理清之后的题意。
我们发现,对于b[]中的每个数,f[]中都要恰好只出现一次。
于是我们对于f[]中的所有数x,记录位置。
x没出现过,e[]便为0
x只出现过一次,e[]便为位置
x出现过多次,e[]便为-1
然后扫描一遍b[],这道题就做完AC啦!
*/
【Codeforces Round 332 (Div 2)B】【扭转题意 位置映射】Spongebob and Joke 给b[]中的每个数找f[]中的位置
最新推荐文章于 2024-07-16 11:49:50 发布