题解:CF599B Spongebob and Joke
完整题意详见题面。
已知 \(b_i=f_{a_i}\),求数组 \(a\) 的值。
先记录每个 \(f_i\) 的值的数量,
-
当 \(f\) 数组中与 \(b\) 数组中没有相同的值时,输出
Impossible -
当 \(f\) 数组中与 \(b\) 数组中有多组相同的值时,输出
Ambiguity -
其余情况输出
Possible。
然后考虑如何求出数组 \(a\),
对于 \(b_i=f_{a_i}\),通过 \(f\) 数组记录每一个可能的 \(a_i\) 的值。易得,数组 \(b\) 的长度与 \(a\) 的长度相等。在判断合法后输出 \(a_{b_i}\) 即可。
时间复杂度 \(O(n)\)。
#include<bits/stdc++.h>
using namespace std;
int cnt[100010],b[100010],a[100010];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
int f;
cin>>f;
cnt[f]++;
a[f]=i;
}
for(int i=1;i<=m;i++){
cin>>b[i];
if(cnt[b[i]]==0){
cout<<"Impossible";
return 0;
}
}
for(int i=1;i<=m;i++){
if(cnt[b[i]]>1){
cout<<"Ambiguity";
return 0;
}
}
cout<<"Possible"<<endl;
for(int i=1;i<=m;i++)
cout<<a[b[i]]<<' ';
return 0;
}
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int cnt[100010],b[100010],a[100010];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
int f;
cin>>f;
cnt[f]++;
a[f]=i;
}
for(int i=1;i<=m;i++){
cin>>b[i];
if(cnt[b[i]]==0){
cout<<"Impossible";
return 0;
}
}
for(int i=1;i<=m;i++){
if(cnt[b[i]]>1){
cout<<"Ambiguity";
return 0;
}
}
cout<<"Possible"<<endl;
for(int i=1;i<=m;i++)
cout<<a[b[i]]<<' ';
return 0;
}

浙公网安备 33010602011771号