//题意:给你两个串,求最长公共子序列,但有个规则两个串在你求最长子序列的过程是可以移动元素位置的,但两个串相同下标的元素在移动的时候始终下标一致,也就是a[0]下标由0变为3的话b[0]的下标也由0变为3.
//思路:其实这么想来此题并不是一道真正意义上的lcs,做法是若任意给一个a的序列 1、3、5、2、4任意给一个对应的b的序列3、4、2、5、1 则 1、3、5、2、4 ==》 1、3、4、5、2 这样就能找到最长子序列什么意思呢,1对应3,那么找3对应的 3、4、2、5、1 ==》3、4、1、2、5放在第二列即3,4, 在找4对应的即4,1放在第三列,此时形成两个环,用n-环数即可(有点绕稍微仔细琢磨一下发现挺简单的)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int a[100000+10];
int b[100000+10];
int c[100000+10];
int vis[100000+100];
int main()
{
int t;
while(scanf("%d", &t) != EOF){
while(t--){
int n;
scanf("%d", &n);
memset(vis, 0, sizeof(vis));
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for(int j = 1; j <= n; j++)
scanf("%d", &b[j]);
for(int i = 1; i <= n; i++)
c[a[i]] = b[i]; //这就是对应关系两个数组的
int ans = n;
for(int i = 1; i <= n; i++){
int x = i;
if(c[x] == x) continue;
if(!vis[x]){
ans--;
while(!vis[x]){
vis[x] = 1;
x = c[x];
}
}
}
printf("%d\n", ans);
}
}
return 0;
}