博客
关于我
Codeforces 471D. MUH and Cube Walls(差分 + KMP,93 ms)
阅读量:709 次
发布时间:2019-03-21

本文共 1462 字,大约阅读时间需要 4 分钟。

为了解决这个问题,我们需要计算在熊的墙中有多少个连续的长度为w的窗口能够与大象的墙高度序列匹配。通过调整每个木塔的高度,使其在相对变化的序列上与大象的墙匹配。

方法思路

  • 问题分析:熊和大象分别建造了两堵木头墙。我们需要找到熊的墙中有多少个窗口,其高度序列可以通过调整来与大象的墙匹配。关键在于相对高度变化的序列一致。

  • 差分数组:计算熊和大象墙的差分数组。差分数组中的每个元素表示相邻高度的差。通过比较差分数组,我们可以简化相对高度调整的问题。

  • KMP算法:使用KMP算法来匹配两个差分数组。KMP算法有效地寻找字符串匹配,可以在线性时间内处理大数组。

  • 解决代码

    #include 
    #include < earmark > // 为了避免警告#pragma warning(disable:4996)int main() { int n, w; scanf("%d%d", &n, &w); if (w == 1) { printf("%d\n", n); return 0; } int a[200002], b[200002]; for (int i = 1; i <= n; ++i) { scanf("%d", &a[i]); } for (int i = 1; i <= w; ++i) { scanf("%d", &b[i]); } int da[200002], db[200002]; for (int i = 1; i <= n-1; ++i) { da[i] = a[i] - a[i-1]; } for (int i = 1; i <= w-1; ++i) { db[i] = b[i] - b[i-1]; } if (n < w) { printf(0); return 0; } int next[200002]; int class1, class2, class3, class4; template
    void getnext(pattern* p, nexttype* next, size_t plen); template
    int KMParray(pattern* p, nexttype* next, size_t plen, size_t targetlen); int ret = KMParray(db + 1, next, w-1, n-1); printf("%d\n", ret); return 0;}

    代码解释

  • 输入处理:读取输入的n和w,以及熊和大象的墙高度数组a和b。
  • 差分数组计算:计算熊和大象的墙的差分数组da和db。
  • 特殊情况处理:如果w=1,直接输出n,因为每个位置都是一个单独的窗口。
  • KMP预处理:构建KMP算法需要的LPS数组,用于预处理模式匹配。
  • KMP匹配:运行KMP算法,在熊的差分数组da中寻找与大象的差分数组db匹配的子序列。
  • 输出结果:输出匹配的结果次数。
  • 通过这种方法,我们可以在较高效的时间复杂度内解决问题,适用于大规模数据。

    转载地址:http://umtez.baihongyu.com/

    你可能感兴趣的文章
    np.arange()和np.linspace()绘制logistic回归图像时得到不同的结果?
    查看>>
    np.power的使用
    查看>>
    NPM 2FA双重认证的设置方法
    查看>>
    npm build报错Cannot find module ‘webpack/lib/rules/BasicEffectRulePlugin‘解决方法
    查看>>
    npm build报错Cannot find module ‘webpack‘解决方法
    查看>>
    npm ERR! ERESOLVE could not resolve报错
    查看>>
    npm ERR! Unexpected end of JSON input while parsing near ‘...“:“^1.2.0“,“vue-html-‘ npm ERR! A comp
    查看>>
    npm error Missing script: “server“npm errornpm error Did you mean this?npm error npm run serve
    查看>>
    npm error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”。要解决此问题,1) 安装
    查看>>
    npm install CERT_HAS_EXPIRED解决方法
    查看>>
    npm install digital envelope routines::unsupported解决方法
    查看>>
    npm install 卡着不动的解决方法
    查看>>
    npm install 报错 EEXIST File exists 的解决方法
    查看>>
    npm install 报错 ERR_SOCKET_TIMEOUT 的解决方法
    查看>>
    npm install 报错 Failed to connect to github.com port 443 的解决方法
    查看>>
    npm install 报错 fatal: unable to connect to github.com 的解决方法
    查看>>
    npm install 报错 no such file or directory 的解决方法
    查看>>
    npm install 权限问题
    查看>>
    npm install报错,证书验证失败unable to get local issuer certificate
    查看>>
    npm install无法生成node_modules的解决方法
    查看>>