zoukankan      html  css  js  c++  java
  • 【Codeforces Round #519 by Botan Investments D】Mysterious Crime

    【链接】 我是链接,点我呀:)
    【题意】

    相当于问你这m个数组的任意长度公共子串的个数

    【题解】

    枚举第1个数组以i为起点的子串。 假设i..j是以i开头的子串能匹配的最长的长度。 (这个j可以给2..m这些数组用一个类似链表的东西很快得到,O((j-i+1)*M)的复杂度即可完成。 那么我们会发现,我们不需要重新再从i+1开始枚举。 因为i..j这一段的任意一个子串都是满足要求(公共子串)的。 而它有len*(1+len)/2个子串 那么我们从j+1开始继续上述步骤就Ok了。 注意m=1的时候。。别死循环了。。。j加一个上界n哦.

    【代码】

    #include <bits/stdc++.h>
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    
    using namespace std;
    
    const int N = 1e5;
    const int M = 10;
    
    int a[M+2][N+10];
    int n,m;
    
    int main()
    {
        scanf("%d%d",&n,&m);
        rep1(i,1,n) scanf("%d",&a[1][i]);
        for (int i = 2;i <= m;i++){
            rep1(j,1,n)
            {
                int x;
                scanf("%d",&x);
                a[i][x] = j;
            }
        }
        int last = 0;
        long long ans = 0;
        for (int i = 1;i <= n;i++){
            int k = i;
            while (1){
                int ok = 1;
                rep1(j,2,m)
                    if (k+1<=n && a[j][a[1][k]]+1==a[j][a[1][k+1]])
                        ok++;
                if (ok==m && k+1<=n){
                    k++;
                }else break;
            }
            ans = ans + 1LL*(1+k-i+1)*(k-i+1)/2;
            i = k;
        }
        printf("%lld
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    Java基础01
    架构漫谈阅读笔记1
    机器学习-分类算法之k-近邻
    机器学习-模型选择
    机器学习-scikit-learn数据集
    机器学习-特征选择
    机器学习-数据的特征预处理
    实现模式阅读笔记二
    实现模式阅读笔记一
    《架构之美》阅读笔记七
  • 原文地址:https://www.cnblogs.com/AWCXV/p/9873440.html
Copyright © 2011-2022 走看看