//离散数学数学中的置换群应用,答案就是找出所有循环的个数(循环长度必须大于1),最后用n-sum(sum为循环个数),每个循环必有一个与其他不同,每个循环牺牲一个元素。就是LCS。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxm=1e5+20;
int a[maxm];
int b[maxm];
int p1[maxm];
int p2[maxm];
int vis[maxm];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
p1[a[i]]=i;
}
for(int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
p2[b[i]]=i;
}
int sum=0;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
int now=i;
int len=0;
while(!vis[now])
{
vis[now]=1;
now=p2[a[now]];
len++;
}
if(len>1)
{
sum++;
}
}
}
printf("%d\n",n-sum);
}
return 0;
}
HDU 5495 LCS(置换群)
最新推荐文章于 2020-03-15 14:56:32 发布