codeforces 1043 D. Mysterious Crime
阿新 • • 發佈:2018-11-23
題目:
傳送門
題意:
給出n行字串,每個字串的長度都為m。
求能夠擷取多少種公共字串。
思路:
可以兩個兩個字元比較,看看比較的兩個字串的兩個字元的索引相減的值是否相同。
然後對求出的公共字串進行分解,可已發現一個字串可以有(len+1)*len/2中構造方法。
程式碼如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <vector> using namespace std; const int maxn=1e5+5; int n,m; int a[15][maxn]; int loc[15][maxn]; int main() { scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { for (int j=1;j<=n;j++) { scanf("%d",&a[i][j]); loc[i][a[i][j]]=j; } } long long num=1; long long int ans=0; for (int i=2;i<=n;i++) { int flag=0; for (int j=2;j<=m;j++) { if(loc[1][a[1][i-1]]-loc[1][a[1][i]]!=loc[j][a[1][i-1]]-loc[j][a[1][i]]) { flag=1; break; } } if(!flag) { num++; } else { ans+=num*(num+1)/2; num=1; } } ans+=num*(num+1)/2; printf("%lld\n",ans); return 0; }