LA 5052 Genome Evolution (思维)

来源:互联网 发布:mac 4k 显示器 hdmi2 编辑:程序博客网 时间:2024/06/06 03:29

LA 5052 Genome Evolution

题目大意:

给1~n的两个排列A,B,统计有多少个子集A,B均有,子集要满足是连续序列,且至少包含两个元素.(1<=n<=5000)

题目分析:

对于两个子集,要满足元素相同,且是连续序列,则长度要一致.
若确定某一个点i为在A序列中的右边界,那么A序列中每往左加入一个元素j,在B中也会对应有一个位置.显然此时能满足元素相同的要求.
那么还需要是连续序列,若在B中的元素最左边在L,最右边在R.若R-L+1==i-j+1,即两序列的长度一致,则B中形成序列是连续序列.

代码

#include<cstdio>#include<iostream>#include<algorithm>using namespace std;const int maxn=3000+10;int A[maxn],B[maxn],pos[maxn],n;int main(){    while(scanf("%d",&n)==1&&n) {        for(int i=0;i<n;i++) scanf("%d",&A[i]);        for(int i=0;i<n;i++) scanf("%d",&B[i]),pos[B[i]]=i;//记录下每个数在B中对应位置         int ans=0;        for(int i=1;i<n;i++) {            int L=pos[A[i]],R=pos[A[i]];            for(int j=i-1;j>=0;j--) {                L=min(L,pos[A[j]]);                R=max(R,pos[A[j]]);                if(R-L+1==i-j+1) ++ans;            }        }        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击