每个串都要经过n个位置,每个位置都要有翻转和不翻转两种情况,根据 p [ i ] 求出组成多少个环,求连成一个环需要改变的次数(1个环ans = 0,否则ans = 环数)
每个串都要有翻转和不翻转两种情况,所以 b [ ]中1的个数应为奇数,否则ans+1
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <vector>
#include <map>
#include <cmath>
#include <stdlib.h>
using namespace std;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int MAX = 2e5+10;
const int mod = 1e9+7;
int p[MAX], vis[MAX], b[MAX], n;
void dfs(int i)
{
vis[i] = 1;
if(!vis[p[i]])dfs(p[i]);
}
int main()
{
cin>>n;
int ans = 0;
memset(vis, 0, sizeof(vis));
for(int i = 1; i<=n; ++i)
scanf("%d", &p[i]);
for(int i = 1; i<=n; ++i)
if(!vis[i])
{
dfs(i);
ans++;
}
if(ans==1)ans--;
int zero = 0, one = 0;
for(int i = 1; i<=n; ++i)
{
scanf("%d", &b[i]);
if(b[i])one++;
else zero++;
}
if(one%2==0)ans++;
cout<<ans<<endl;
return 0;
}