Codeforces Round #519 D - Mysterious Crime
阿新 • • 發佈:2018-11-01
題意:
在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 { 12View Codescanf("%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 }