zoukankan      html  css  js  c++  java
  • b_lc_通过连接另一个数组的子数组得到一个数组(kmp求起始位置)

    你是否可以从 nums 中选出 n 个 不相交 的子数组,使得第 i 个子数组与 groups[i] (下标从 0 开始)完全相同,且如果 i > 0 ,那么第 (i-1) 个子数组在 nums 中出现的位置在第 i 个子数组前面。(也就是说,这些子数组在 nums 中出现的顺序需要与 groups 顺序相同)(数据范围都小于100)

    思路:emm

    const int N=1e4;
    class Solution {
    public:
        vector<int> kmp(vector<int>& s, vector<int>& t, vector<int>& nx) {
            int n=s.size()-1, m=t.size()-1;
            for (int i=1,j=0; i<=n; i++) {
                while (j && s[i]!=t[j+1]) j=nx[j];
                if (s[i]==t[j+1]) j++;
                if (j==m)
                    return {i-m+1, i};
            }
            return {};
        }
        vector<int> get_nx(vector<int>& t) {
            vector<int> nx(N,0);
            for (int i=2,j=0,n=t.size()-1; i<=n; i++) {
                while (j && t[i]!=t[j+1]) j=nx[j];
                if (t[i]==t[j+1]) j++;
                nx[i]=j;
            }
            return nx;
        }
        bool canChoose(vector<vector<int>>& groups, vector<int>& A) {
            int l=-1, r=-1;
            A.insert(A.begin(), 123124);
            for (auto& g : groups) {
                g.insert(g.begin(), -323234);
                auto nx = get_nx(g);
                auto p = kmp(A,g,nx);
                if (p.size()==0) 
                    return false;
                if (p[0]<=r) 
                    return false;
                r = p[1];
            }
            return true;
        }
    };
    
  • 相关阅读:
    AcWing 125. 耍杂技的牛
    AcWing 148. 合并果子
    AcWing 907. 区间覆盖
    AcWing 908. 最大不相交区间数量
    AcWing 906. 区间分组
    AcWing 905. 区间选点
    AcWing 285. 没有上司的舞会
    AcWing 1049. 大盗阿福
    AcWing 901. 滑雪
    AcWing 91. 最短Hamilton路径
  • 原文地址:https://www.cnblogs.com/wdt1/p/14423931.html
Copyright © 2011-2022 走看看