1. 程式人生 > >【CF1043D】Mysterious Crime(貢獻)

【CF1043D】Mysterious Crime(貢獻)

個人 str 開始 algo 都是 typedef pair 需要 匹配

題意:給定m個人,每個人有n個數字且每個人的所有數字都是一個n的排列,求有多少種方案去掉某個前綴和後綴後m個人剩余的部分相等

m<=10,n<=1e5

思路:考慮極長的一段連續匹配的串,因為最後需要是連續的一段,所以它對答案的貢獻應該是它的子串個數

剛開始以為是子序列個數還傻乎乎的去寫高精了,也算是一個教訓吧

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<string>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7
#include<map> 8 #include<queue> 9 #include<vector> 10 #include<ctime> 11 using namespace std; 12 typedef long long ll; 13 typedef unsigned int uint; 14 typedef unsigned long long ull; 15 typedef pair<int,int> PII; 16 typedef vector<int> VI; 17 #define fi first 18
#define se second 19 #define MP make_pair 20 #define N 110000 21 #define M 130 22 #define MOD 1000000007 23 #define eps 1e-8 24 #define pi acos(-1) 25 26 int a[11][N],b[11][N],n,m; 27 28 int isok(int x,int y) 29 { 30 //if(x==0) return 1; 31 for(int i=2;i<=m;i++) 32 if(b[i][x]!=b[i][y]-1) return
0; 33 return 1; 34 } 35 36 37 int main() 38 { 39 scanf("%d%d",&n,&m); 40 for(int i=1;i<=m;i++) 41 for(int j=1;j<=n;j++) 42 { 43 scanf("%d",&a[i][j]); 44 b[i][a[i][j]]=j; 45 } 46 a[1][0]=0; 47 ll ans=0; 48 ll len=1; 49 for(int i=2;i<=n;i++) 50 if(isok(a[1][i-1],a[1][i])) len++; 51 else 52 { 53 //printf("len=%lld\n",len); 54 ans+=(len+1)*len/2; 55 len=1; 56 } 57 //printf("len=%lld\n",len); 58 ans+=(len+1)*len/2; 59 60 printf("%lld\n",ans); 61 return 0; 62 }



【CF1043D】Mysterious Crime(貢獻)