1. 程式人生 > >codeforces 1043 D. Mysterious Crime

codeforces 1043 D. Mysterious Crime

題目:
傳送門

題意:
給出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;
}