题解:CF2008D Sakurako's Hobby
可以发现可以转化的数字之间出现了环,我们遍历每一个值,记录这个值可以到达的数字,结果为过程中出现了黑色的数字。
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
vector<int>p(n);
vector<int>F(n,0);
vector<bool>visited(n,false);
string s;
for(int i=0;i<n;i++){
cin>>p[i];
p[i]--;
}
cin>>s;
for(int i=0;i<n;i++){
if(!visited[i]){
vector<int>cycle;
int cnt=0;
int cur=i;
while(!visited[cur]){
visited[cur]=true;
cycle.push_back(cur);
if(s[cur]=='0'){
cnt++;
}
cur=p[cur];
}
for(int index:cycle){
F[index]=cnt;
}
}
}
for(int i=0;i<n;i++){
cout<<F[i]<<" ";
}
cout<<endl;
}
return 0;
}

浙公网安备 33010602011771号