首页 > 其他分享 >关于KMP的应用几例

关于KMP的应用几例

时间:2022-11-10 22:14:08浏览次数:59  
标签:int 几例 kmp len ++ 应用 KMP pi

信息竞赛中,KMP大概是字符串方面最经典的算法了。参考了部分代码,KMP的写法大概有两种

  1. 在原有字符串上进行KMP
#include <bits/stdc++.h>
using namespace std;

const int S = 1000010;
int kmp[S], len_a, len_b, j;
char a[S], b[S];

int main() {
    scanf("%s", a + 1);
    scanf("%s", b + 1);
    len_a = strlen(a + 1);
    len_b = strlen(b + 1);
    for (int i = 2; i <= len_b; i++) {
        while (j && b[i] != b[j + 1]) j = kmp[j];
        if (b[j + 1] == b[i]) j++;
        kmp[i] = j;
    }
    j = 0;
    for (int i = 1; i <= len_a; i++) {
        while (j > 0 && b[j + 1] != a[i]) j = kmp[j];
        if (b[j + 1] == a[i]) j++;
        if (j == len_b) {
            printf("%d\n", i - len_b + 1);
            j = kmp[j];
        }
    }
    for (int i = 1; i <= len_b; i++)
        printf("%d ", kmp[i]);
    printf("\n");
    return 0;
}
  1. 在嫁接字符串上进行KMP
#include <bits/stdc++.h>
using namespace std;

const int N = 100010, M = 1000010;
int pi[M + N], n, m;

void prefix(string s) {
    int len = s.length();
    for (int i = 1; i < len; i++) {
        int j = pi[i - 1];
        while (j > 0 && s[i] != s[j]) j = pi[j - 1];
        if (s[i] == s[j]) j++;
        pi[i] = j;
    }
}

int main() {
    string s, t;
    cin >> s >> t;
    n = s.length(), m = t.length();
    prefix(s + " " + t);
    for (int i = n + 1; i <= n + m; i++)
        if (pi[i] == n) printf("%d ", i - 2 * n);
    printf("\n");

    return 0;
}

至于KMP算法的解释,个人认为OI-Wiki上提供的解释很详尽
KMP算法的一般应用一般是字符串匹配

标签:int,几例,kmp,len,++,应用,KMP,pi
From: https://www.cnblogs.com/tynfms-bjq/p/16878947.html

相关文章

  • 一个简单实用的Android调试应用技巧
    在应用开发中,我们常常会进行日志打印或者debug调试,以此来分析运行时的一些信息,便于发现bug和问题。AndroidStudio的Debug功能很好用,但是有时候有些情况下,就显得不是那么快......
  • 关于 Android 应用多进程的整理
    在计算机操作系统中,进程是进行资源分配和调度的基本单位。这对于基于Linux内核的Android系统也不例外。在Android的设计中,一个应用默认有一个(主)进程。但是我们通过配置可......
  • Gartner权威报告解读:探究应用可观测性的发展
    早前,应用可观测性入选全球最具权威的IT研究与顾问咨询公司Gartner发布的企业机构在2023年需要探索的十大战略技术趋势之一。ONE可观测性的概念及趋势解析Gartner杰出研究副......
  • 实验7:基于REST API的SDN北向应用实践
    实验7:基于RESTAPI的SDN北向应用实践 实验7:基于RESTAPI的SDN北向应用实践一、实验目的能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;能够编写程序调用R......
  • BI智慧工程行业应用方案丨文末获取三重资源包
    文末获取资源包丨BI智慧工程行业应用方案详解,不要错过!我国工程行业现状对于我国现阶段的工程行业来说,建设项目普遍具有规模化、群体化和复杂化等特征,而通常不具备项目管理......
  • ASEMI肖特基二极管SBT10100VCT参数,SBT10100VCT应用
    编辑-ZASEMI肖特基二极管SBT10100VCT参数:型号:SBT10100VCT最大重复峰值反向电压(VRRM):100V最大平均正向整流输出电流(IF):10A峰值正向浪涌电流(IFSM):150A每个元件的典型热阻(ReJA):2℃/......
  • 账号从HR系统到AD域再到邮箱等应用系统,如何自动化管理员工账号生命周期?
    随着企业的发展壮大,员工数量越来越多,业务系统数量也越来越多,同时伴随着员工入/离职、调岗等情况不断发生,企业IT运维承担着巨大的压力。主要体现在以下几个方面:IT运维成本......
  • Si24R2F+ 无线发射芯片的主要特性及应用介绍
    Si24R2F+是一颗工作在2.4GHzISM频段,专为低功耗无线场合设计,集成嵌入式发射基带的无线发射芯片。工作频率范围为2400MHz-2525MHz,共有126个1MHz带宽的信道。Si24R2F......
  • ASEMI肖特基二极管SBT10100VCT参数,SBT10100VCT应用
    编辑-ZASEMI肖特基二极管SBT10100VCT参数:型号:SBT10100VCT最大重复峰值反向电压(VRRM):100V最大平均正向整流输出电流(IF):10A峰值正向浪涌电流(IFSM):150A每个元件的典型热阻(R......
  • 如何开发一个标准的云原生应用?
    作者:孤弋(李颜良)从几个数字开始说IDC预计到2024年,由于采用了微服务、容器、动态编排和DevOps等技术,新增的生产级云原生应用在新应用的占比将从2020年的10%增加......