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 "); 45 } 46 else if(Ambiguity){ 47 printf("Ambiguity "); 48 } 49 else{ 50 printf("Possible "); 51 for(int i = 1; i<= m; i++){ 52 printf("%d", a[i]); 53 if(i != m) printf(" "); 54 } 55 printf(" "); 56 } 57 } 58 59 return 0; 60 }