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

来源:互联网 发布:vs2005操作mysql 编辑:程序博客网 时间:2024/06/07 06:20

这题智商低,想了很久没有想到怎么做,其实想通了很简单,由于俩个数列都是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 longusing namespace std;const int N=1e5+10;int a[N],b[N],c[N];bool bo[N];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;}


0 0