fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. void solve() {
  8. int n;
  9. cin >> n;
  10.  
  11. vector<int> p(n + 1);
  12. for (int i = 1; i <= n; i++) {
  13. cin >> p[i];
  14. }
  15.  
  16. string s;
  17. cin >> s;
  18.  
  19. vector<int> ans(n + 1, 0);
  20. vector<bool> visited(n + 1, false);
  21.  
  22. for (int i = 1; i <= n; i++) {
  23. if (!visited[i]) {
  24. vector<int> cycle;
  25. int curr = i;
  26. int black_count = 0;
  27.  
  28. while (!visited[curr]) {
  29. visited[curr] = true;
  30. cycle.push_back(curr);
  31. if (s[curr - 1] == '0') {
  32. black_count++;
  33. }
  34. curr = p[curr];
  35. }
  36.  
  37. for (int node : cycle) {
  38. ans[node] = black_count;
  39. }
  40. }
  41. }
  42.  
  43. for (int i = 1; i <= n; i++) {
  44. cout << ans[i] << (i == n ? "" : " ");
  45. }
  46. cout << "\n";
  47. }
  48.  
  49. int main() {
  50. ios_base::sync_with_stdio(false);
  51. cin.tie(NULL);
  52.  
  53. int t;
  54. cin >> t;
  55. while (t--) {
  56. solve();
  57. }
  58.  
  59. return 0;
  60. }
Success #stdin #stdout 0.01s 5288KB
stdin
5
1
1
0
5
1 2 4 5 3
10101
5
5 4 1 3 2
10011
6
3 5 6 1 2 4
010000
6
1 2 3 4 5 6
100110
stdout
1
0 1 1 1 1
2 2 2 2 2
4 1 4 4 1 4
0 1 1 0 0 1