hdu 5495 BestCoder Round #58 (div.2) 1002

来源:互联网 发布:新商盟软件下载 编辑:程序博客网 时间:2024/05/29 16:27

题目:点击打开链接

分析:求连个序列的最长公共子序列,因为可以按照给定的序列p来排列a,b序列,所以只要求出a,b可以构成多少个环就可以了,自环一定可以是公共序列一部分,环-1也可以构成公共序列一部分。


#include<cstdio>#include<cstring>using namespace std;const int maxn=100007;int a[maxn],b[maxn],pa[maxn],pb[maxn];bool vis[maxn];int main(){    int T,n,t;   // freopen("f.txt","r",stdin);    scanf("%d",&T);    while(T--){        scanf("%d",&n);        for(int i=1;i<=n;i++){            scanf("%d",&t);            pa[t]=i;        }        for(int i=1;i<=n;i++){            scanf("%d",&b[i]);        }        memset(vis,0,sizeof(vis));        int ans=n;        for(int i=1;i<=n;i++){            if(!vis[i]){               // vis[i]=true;               int x=i;               int sum=0;                while(x){                    vis[x]=true;                    sum++;                    //printf("%d",x);                    if(vis[b[pa[x]]])break;                    x=b[pa[x]];                }                if(sum>1)ans--;            }        }        printf("%d\n",ans);    }}


0 0
原创粉丝点击