一道水题WA那么多发,也是醉了。f看成函数的话,其实就是判断一下反函数存不存在。
坑点,只能在定义域内判断,也就是只判断b[i]。没扫一遍前不能确定Impossible。
#includeusing namespace std;typedef long long ll;const int maxn = 1e5+10;int f[maxn], b[maxn], a[maxn];int g[maxn];bool mul[maxn];//#define LOCALint main(){#ifdef LOCAL freopen("in.txt","r",stdin);#endif int n, m; scanf("%d%d",&n,&m); bool Abm = false; for(int i = 1; i <= n; i++){ scanf("%d", f+i); if(g[f[i]]) mul[f[i]] = true; g[f[i]] = i; } for(int i = 1; i <= m; i++){ scanf("%d", b+i); } bool Imp = false; for(int i = 1; i <= m; i++){ if(!g[b[i]]) { Imp = true; break; } if(mul[b[i]]){ Abm = true; } a[i] = g[b[i]]; } if(Imp) puts("Impossible"); else { if(Abm) puts("Ambiguity"); else { puts("Possible"); for(int i = 1; i <= m; i++){ printf("%d%c", a[i], i != m? ' ': '\n'); } } } return 0;}