其实就是每一列可以重排,然后问LCS。
我们可以发现,把 b 看成 a 的置换,那么每个环的贡献都是环的大小 - 1 。特判环为1,贡献为1。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include
//#define int long long
using namespace std;
const int N=1e5+10;
int vis[N],a[N],b[N],res,cnt,n;
void solve(){
scanf("%d",&n); res=0;
for(int i=1;i<=n;i++) scanf("%d",&a[i]),vis[i]=0;
for(int i=1;i<=n;i++) scanf("%d",&b[a[i]]);
for(int i=1;i<=n;i++) if(!vis[i]){
int now=i; cnt=0;
while(!vis[now]) vis[now]=1,cnt++,now=b[now];
res+=max(1,cnt-1);
}
printf("%d\n",res);
}
signed main(){
int T; cin>>T; while(T--) solve();
return 0;
}