1. 程式人生 > >Codeforces Round #519 D - Mysterious Crime

Codeforces Round #519 D - Mysterious Crime

 

題目

 

題意:

  在m組數,每組有n個數(數的範圍1-n)中,找到某些序列 使它是每組數的一個公共子序列,問這樣的某些序列的個數?

 

思路:

      不難想出答案ans是≥n的。

       創立一個next陣列,使每組中第i個數的next 是第i+1個數,即 nex[ a[i] ] = a[ i+1 ] (實際上設next是二維陣列)。對第一組中的第i個數,如果在其餘每組的next[ a[ i ] ]都是等於第一組中a[ i+1 ]的,意味著序列 a[ i ],a[ i+1 ]是一個公共子序列。       利用一個數組 d[ ],d[ i ]記做 第 i 個數到第1個數之間滿足條件的子序列的個數 。

對 i ,如果滿足條件,是公共子序列的話,d[ i ]=d[ i-1 ] + d[ i ],當然初始的時候 d[ i ] =1 。

 

答案是 long long型的。

 1 int n,m,a[11][N];
 2 int nex[11][N];
 3 ll d[N];
 4 
 5 int main()
 6 {
 7     cin>>n>>m;
 8     for(int i=1;i<=m;i++)
 9     {
10         for(int j=1;j<=n;j++)
11         {
12
scanf("%d",&a[i][j]); 13 nex[i][a[i][j-1]]=a[i][j]; 14 } 15 } 16 17 d[1]=1; 18 for(int i=1;i<=n-1;i++) 19 { 20 int x=a[1][i]; 21 int flag=0; 22 d[i+1]=1; 23 for(int j=2;j<=m;j++) 24 { 25 if
(a[1][i+1] != nex[j][x] ){ 26 flag=1; break; 27 } 28 } 29 if(!flag) d[i+1]+= d[i]; 30 } 31 32 ll ans=0; 33 34 for(int i=1;i<=n;i++) 35 { 36 ans+=d[i]; 37 } 38 cout<<ans<<endl; 39 }
View Code