链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5495
题意:
告诉你两个序列An和Bn,都是{1,2,,...n}的排列,然后现在可以任意交换每一列,问之后能构成最长公共子序列是多长
#include <bits/stdc++.h>
using namespace std;
const int maxn =1e5+19;
struct Node
{
int a,b;
} node[maxn];
bool vis[maxn];
int pos[maxn];
int main()
{
ios::sync_with_stdio(false);
int t,n;
cin>>t;
while(t--)
{
cin>>n;
memset(vis,0,sizeof vis);
for(int i=1; i<=n; i++)
{
cin>>node[i].a;
pos[node[i].a]=i;
}
for(int j=1; j<=n; j++)
{
cin>>node[j].b;
}
int ans=0;
for(int i=1; i<=n; i++)
{
if(vis[node[i].a])
continue;
int equa=0;
int x=node[i].b;
int j=node[i].a;
while(x!=node[i].a)
{
vis[j]=1;
// int po=pos[x];
int po =pos[x];
x=node[po].b;
j=node[po].a;
equa++;
}
vis[j]=1;
if(equa>0)
ans++;
}
cout<<n-ans<<endl;
}
return 0;
}