BestCoder Round#58 LCS、すなわちhdu 5495(シミュレーション)

6671 ワード

LCS
Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 505    Accepted Submission(s): 274
Problem Description
You are given two sequence 
{a1,a2,...,an} and 
{b1,b2,...,bn}. Both sequences are permutation of 
{1,2,...,n}. You are going to find another permutation 
{p1,p2,...,pn} such that the length of LCS (longest common subsequence) of 
{ap1,ap2,...,apn} and 
{bp1,bp2,...,bpn} is maximum.
 
Input
There are multiple test cases. The first line of input contains an integer 
T, indicating the number of test cases. For each test case:
The first line contains an integer 
n(1≤n≤105) - the length of the permutation. The second line contains 
n integers 
a1,a2,...,an. The third line contains 
nintegers 
b1,b2,...,bn.
The sum of 
n in the test cases will not exceed 
2×106.
 
Output
For each test case, output the maximum length of LCS.
 
Sample Input
 
   
2 3 1 2 3 3 2 1 6 1 5 3 2 6 4 3 6 2 4 5 1
 

Sample Output
 
   
2 4
 

Source
BestCoder Round #58 (div.2)
 

Recommend
hujie   |   We have carefully selected several similar problems for you:   5498  5497  5496  5495  5493 
 


解析:1.子序列的含义。这里的子序列与我们以前所认知的略有不同,是数学意义上的子序列。

    ,                                   (     )       。   \{1,3,2\}{1,3,2}  \{1, 4, 3, 5, 2, 1\}{1,4,3,5,2,1}      .

           2.リングを求める.BCの問題解には求環があり、それから長さを加算し、より詳細な解釈はなくなりました.ここで詳しく説明します.
              各a[i]について、b[i]には2つのケースがある.
               ①b[i]==a[i]
                   この場合( 何が言いたいと思ってるの?特例として覚えておけばいいのに)   
               ②b[i]!=a[i]
                   この場合,a[i]が長男シーケンスに関与すると,転位になるしかない.たとえば、次のようなデータのセットがあります.
                   1 3 2 4
                   3 2 4 1
                   一人間違えて、こうなりました.
                    1 3 2 4
                       3 2 4 1
                   長男シーケンスは、3 2 4です.
                   これはどのように処理しますか?
                   a1-->b3-->a3-->b2-->a2-->b4-->a4-->b1-->a1
                   すなわち,数字1からA数列とB数列の1対1の対応関係により,最終的には必ず1に戻るループである.このリングでは,Aの長さ=Bの長さ=4,サブシーケンスの長さは3であり,L>1の場合,ans+=L−1がある理由である.
           3.公式に与えられた問題解は、すべてのループLを見つけ、L==1(すなわちa[i]==b[i])、ans+=1である.L>1の場合、ans+=L-1となります.
              しかし、実際には、2つの数列はいずれも1からnまでのn個の数であるため、2つの数列は必然的にリングから構成される.したがって,L>1のリングの数J,ans=n−Jのみが要求される. 
コード:
#include
#include
#include
using namespace std;

const int maxn=1e5;
int a[maxn +10],b[maxn+10];
bool v[maxn+10];

int getin()
{
  int ans=0;char tmp;
  while(!isdigit(tmp=getchar()));
  do ans=(ans<<3)+(ans<<1)+tmp-'0';
  while(isdigit(tmp=getchar()));
  return ans;
}

int main()
{
  freopen("1.in","r",stdin);
  int t,n,ans,i,j,k;
  for(t=getin();t>0;t--)
    {
      ans=n=getin();
      for(i=1;i<=n;i++)a[i]=getin();
      for(i=1;i<=n;i++)b[a[i]]=getin();
      
      memset(v,0,sizeof(v));
      for(i=1;i<=n;i++)if(!v[i] && b[i]!=i)
        for(--ans,k=i;!v[k];k=b[k])v[k]=1;
	  printf("%d
",ans); } return 0; }