Codeforces Round #332 (Div. 2) B. Spongebob and Joke 水题
2015-11-21 03:09
260 查看
B. Spongebob and Joke
Time Limit: 20 SecMemory Limit: 256 MB
题目连接
http://codeforces.com/contest/599/problem/BDescription
While Patrick was gone shopping, Spongebob decided to play a little trick on his friend. The naughty Sponge browsed through Patrick's personal stuff and found a sequence a1, a2, ..., am of length m, consisting of integers from 1 to n, not necessarily distinct. Then he picked some sequence f1, f2, ..., fn of length n and for each number ai got number bi = fai. To finish the prank he erased the initial sequence ai.It's hard to express how sad Patrick was when he returned home from shopping! We will just say that Spongebob immediately got really sorry about what he has done and he is now trying to restore the original sequence. Help him do this or determine that this is impossible.
Input
The first line of the input contains two integers n and m (1 ≤ n, m ≤ 100 000) — the lengths of sequences fi and bi respectively.
The second line contains n integers, determining sequence f1, f2, ..., fn (1 ≤ fi ≤ n).
The last line contains m integers, determining sequence b1, b2, ..., bm (1 ≤ bi ≤ n).
Output
Print "Possible" if there is exactly one sequence ai, such that bi = fai for all i from 1 to m. Then print m integers a1, a2, ..., am.
If there are multiple suitable sequences ai, print "Ambiguity".
If Spongebob has made a mistake in his calculations and no suitable sequence ai exists, print "Impossible".
Sample Input
3 3 3 2 1 1 2 3
Sample Output
Possible 3 2 1
HINT
题意给你n个f[i],m个b[i],然后问你能不能找到m个a[i],使得b[i]=f[a[i]]
题解:
暴力存一下这个数在f[i]中出现了多少次,如果没出现就输出impossilbe,如果出现多次,就多解,如果出现一次就输出这个数。(注意impossible的优先级大于多解,这是hack点
注意ai可以等于aj
代码
#include<iostream> #include<math.h> #include<vector> #include<stdio.h> using namespace std; #define maxn 100005 int a[maxn]; int f[maxn]; int b[maxn]; vector<int> Q[maxn]; int main() { int n,m;scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%d",&f[i]); for(int i=0;i<m;i++) scanf("%d",&b[i]); for(int i=0;i<n;i++) Q[f[i]].push_back(i); int flag = 0; for(int i=0;i<m;i++) { if(Q[b[i]].size()==0) return puts("Impossible"); if(Q[b[i]].size()>1) flag = 1; } if(flag == 1) return puts("Ambiguity"); puts("Possible"); for(int i=0;i<m;i++) printf("%d ",Q[b[i]][0]+1); printf("\n"); }
相关文章推荐
- Codeforces Round #332 (Div. 2) A. Patrick and Shopping 水题
- 1044 - Palindrome Partitioning (记忆化搜索乱搞)
- sublime text 快捷键汇总
- Jni :三维数组处理方法 ,以整形三维数组为例 C++实现
- hdu-4561 连续最大积( 水题)
- 网站部署之~阿里云系列汇总
- Android判断横屏竖屏代码
- 我所理解的执行力
- freebsd 代码移植时 gcc 相关bug
- Android播放器框架分析之AwesomePlaye
- 新闻web小酌
- 安卓小学生四则运算
- BZOJ4337 : BJOI2015 树的同构
- fstream的使用方法介绍
- 【开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位...
- Charles 从入门到精通
- Citrix Xen300上海培训之我见
- 二分查找的三种实现
- lua 使用定时器
- Tomcat get 中文乱码