【CF1043D】Mysterious Crime(貢獻)
阿新 • • 發佈:2018-10-29
個人 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) return0; 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(貢獻)