BC题解:
题目中给出的是两个排列, 于是我们我们可以先把排列分成若干个环, 显然环与环之间是独立的. 事实上对于一个长度为l(l>1)l (l > 1)l(l>1)的环, 我们总可以得到一个长度为l−1l-1l−1的LCS, 于是这个题的答案就很明显了, 就是nnn减去长度大于111的环的数目.
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1E5+5;
struct Node
{
int a,b;
};
Node f[N];
bool vis[N];
bool cmp(const Node x,const Node y)
{
return x.a<y.a;
}
void work()
{
int i,j,n,ans,cnt;
memset(f,0,sizeof(f));
memset(vis,0,sizeof(vis));
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&f[i].a);
for(i=1;i<=n;i++) scanf("%d",&f[i].b);
sort(f+1,f+n+1,cmp);
cnt=0;
for(i=1;i<=n;i++)
if(!vis[i])
{
int p=f[i].b;
if(p!=i) cnt++;
while(!vis[p])
{
vis[p]=1;
p=f[p].b;
}
}
ans=n-cnt;
printf("%d\n",ans);
}
int main()
{
int T;
scanf("%d",&T);
while(T--) work();
return 0;
}