您的位置:首页 > 其它

HDU5495求俩个1~n的数列按照相同的规则重排后的LCS

2015-10-04 03:22 309 查看
这题智商低,想了很久没有想到怎么做,其实想通了很简单,由于俩个数列都是1~n的排列,

所以在每个位置的a[i]和b[i]建一条边,然后通过样例可以很明显看出来,建边之后会形成n多个环,

而每个环视相互独立的,对于长度大于1的每个环都可以以牺牲一个值得代价取得最长公共子串。

总有那么些巧妙地题是我这种智商低的想不到的。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<algorithm>
#include<iostream>
#include<set>
#define LL long long
using namespace std;
const int N=1e5+10;
int a
,b
,c
;
bool bo
;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
memset(bo,0,sizeof(bo));
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
{
scanf("%d",&b[i]);
c[a[i]]=b[i];
}
int ans=n;
for(int i=1;i<=n;i++)
{
if(!bo[i])
{
int x=i;
if(c[x]!=x)
ans--;
while(!bo[x])
{
bo[x]=1;
x=c[x];
}
}
}
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: