【模拟】【codeforces】599B Spongebob and Joke

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=282385

 

就是一个人最开始有一串数a1 a2 ... am

他的熊孩子队友用一组函数f1 f2 ... fn 以及bi = fai 把串A换成了串B

现在告诉你B和F,让你把A换回来,能换回来输出A,换回来可能有多重情况输出ambiguity,不可能换回来输出impossible

 

ai其实就是f的一个定位,给出一个f(x),求x

所以出现多解的情况就是对于一个b中的值,f有超过一个以上的位置上的值等于bi

出现不可能的情况就是对于一个bi,没有f中的值与之对应

 

因为最后输出的就是x这个位置,所以直接在输入的时候把f翻转一下,f[i]的值表示f在i这个值的时候的定位,之后直接输出即可 

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int f[100005];
 5 int b[100005];
 6 int a[100005];
 7 int n, m;
 8 bool Ambiguity;
 9 bool Impossible;
10 bool ambi[100005];
11 
12 int main(){
13     while(~scanf("%d%d", &n, &m)){
14         Ambiguity = false;
15         Impossible = false;
16         memset(ambi, 0, sizeof(ambi));
17         memset(f, 0, sizeof(f));
18         memset(b, 0, sizeof(b));
19         memset(a, 0, sizeof(a));
20         for(int i = 1; i <= n; i++){
21             int pos;
22             scanf("%d", &pos);
23             if(f[pos] == 0) f[pos] = i;
24             else{
25                 ambi[pos] = true;
26             }
27         }
28         for(int i = 1; i <= m; i++){
29             scanf("%d", &b[i]);
30         }
31 
32         //solve()
33         for(int i = 1; i <= m; i++){
34             if(f[ b[i] ] != 0 && ambi[ b[i] ] != true) a[i] = f[ b[i] ];
35             else if(f[ b[i] ] == 0){
36                 Impossible = true;
37             }
38             else{
39                 Ambiguity = true;
40             }
41         }
42 
43         if(Impossible){
44             printf("Impossible\n");
45         }
46         else if(Ambiguity){
47             printf("Ambiguity\n");
48         }
49         else{
50             printf("Possible\n");
51             for(int i = 1; i<= m; i++){
52                 printf("%d", a[i]);
53                 if(i != m) printf(" ");
54             }
55             printf("\n");
56         }
57     }
58 
59     return 0;
60 }

 

posted @ 2016-03-30 10:45  快扶哀家去刷题  阅读(244)  评论(0编辑  收藏  举报