题解: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;
}

posted @ 2024-10-13 19:09  cly312  阅读(23)  评论(0)    收藏  举报