传送门:
http://codeforces.com/problemset/problem/599/B
题意:
给出序列f[i]和f[a[i]],要求还原序列a[i]
不就是记录一下ans[f[i]]=i,然后再去求ans[f[a[i]]]不就是a[i]了么
那么在具体判断的过程中,肯定是先判断卷是不是
impossible,再判断是不是无穷,最后再记录一下答案不就ok了么
刚开始还在纠结n和m的大小问题,感觉其实大可不必,只需要按照样例的判断方法去判断一下,照着套路去写应该就可以了
炸了,Wrong on test10,53
姿势太不优美了,刚开始是ambiguity判断错了,我是一旦f序列有相同的元素就判ambiguity,但实际上这个序列中m的大小是可能小于n的,所以说应该判断b序列中实际出现的值在f中是不是有多次,所以说之前那样写就把本应该possible 的值判成了ambiguity,然后改的时候,手残居然把b打成了f,哎,真应该再仔细看一看改过后的代码啊!!!
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n,m;int f[maxn],b[maxn],ans[maxn];int vis[maxn];
int main(){
scanf("%d%d",&n,&m);
int flag=0;
for(int i=1;i<=n;i++){
scanf("%d",&f[i]);
if(ans[f[i]]>0||ans[f[i]]==-1){
ans[f[i]]=-1;continue;
}
ans[f[i]]=i;
}
for(int i=1;i<=m;i++){
scanf("%d",&b[i]);
}
for(int i=1;i<=m;i++){
if(ans[b[i]]==0) return puts("Impossible");
}
for(int i=1;i<=m;i++){
if(ans[b[i]]==-1)
return puts("Ambiguity");
}
puts("Possible");
for(int i=1;i<=m;i++){
printf("%d ",ans[b[i]]);
}
printf("\n");
return 0;
}