KMP算法学习笔记

001、专栏导论:为什么我们需要MLIR与算子中间表示 五年前,大家还在争论“TVM还是XLA”。现在回头看,TVM的Relay IR和XLA的HLO都是特定领域的IR,它们解决了各自的问题,但缺乏通用性。MLIR的出现,本质上是因为硬件异构化已经到了一个临界点——CPU、GPU、NPU、DSP、FPGA,每个硬件都有自己的指令集和内存层次,没有一个统一的IR能同时高效表达所有硬件的计算模式。MLIR的“方言+渐进式lowering”模式,恰好提供了这种灵活性。你可以为每个硬件定制一套方言,然后共享公共的lowering路径。 阅读详情

前几天学习了关于字符串处理的KMP算法,刚学的时候没怎么懂,通过今天的练题,终于把KMP掌握了。

KMP算法利用了字符串的一些特殊性质,通过前缀数组,将单个字符串的匹配问题由 O(m∗n) 优化到了 O(m+n) 。

这里,我存几段关键性代码。

首先是get_next()函数

void get_next()
{
    int i=0,j=-1;
    next[0] = -1;
    while(i != m)
    {
        if(j==-1||a[i] == a[j])
            next[++i] = ++j;
        else j = next[j];
    }
}

然后是KMP()

void KMP()
{
    int cnt = 0;
    int i = 0,j = 0;
    while(i!=n&&j!=m){// m表示子串长度
        if(t[i] != a[j]&&j!=-1){
            j=next[j];
        }
        else {i++;j++;}
        if(j == m){
            cnt++;
            j = next[j];
        }
    }
    printf("%d\n",cnt);//这是求子串个数
}
void KMP()
{
    int i = 0,j = 0;
    int ans = -1;
    while(i != n && j != m){
        if(a[i] == b[j] || j == -1){
            ++i,++j;
        }
        else j = next[j];

        if(j == m){
            ans = i+1-m;break;
        }
    }
    printf("%d\n",ans);//这是求第一次匹配的下标,ans = -1表示不能匹配
}

还有一类奇怪的问题,询问一段字符串的循环节,这就只需要在get_next()上改一点就好了

//-----poj2406-----这是求整个字符串的循环节个数

        int i = 0,j = -1;
        next[0] = -1;
        while(i != len){
            if(j == -1 || s[i] == s[j])
            next[++i] = ++j;
            else j = next[j];
        }
        int ans = 1;
        if(len % (len - next[len]) == 0){
            ans = len / (len - next[len]);
        }
        printf("%d\n",ans);
//-----poj1961-----这是求前i个字符中循环节的个数

        printf("Test case #%d\n",++t);

        int i = 0,j = -1;
        next[0] = -1;
        while(i != len){
            if(j == -1 || s[i] == s[j]){
                next[++i] = ++j;
                if(i % (i - next[i]) == 0){
                    int k = i / (i - next[i]);
                    if(k>1)printf("%d %d\n",i,k);
                }
            }
            else j = next[j];
        }
        printf("\n");

留题备忘(附题解)

pku2406 Power Strings

pku1961 Period

pku2752 Seek the Name, Seek the Fame

pku3461 Oulipo

pku2185 Milking Grid

zjut1349 掷硬币

【WRFDA输入数据】全球高空观测气象数据(LITTLE_R 格式数据) 阅读详情

相关推荐

别再只盯着照片了!手把手教你用Python提取大疆照片里的GPS、姿态和RTK数据

本文详细介绍了如何使用Python提取大疆照片中的GPS、姿态和RTK数据,帮助用户解锁无人机拍摄照片中的隐藏元数据。通过实战代码示例,展示了如何解析EXIF格式的定位、姿态和RTK状态信息,并实现批量处理与数据分析,适用于测绘、农业巡检等专业领域。

weixin_30790841的博客 155

数据结构-KMP算法 带你悟透KMP(超详细)学习笔记

详细推导+完整代码+运行结果。从下标为1和下标为0两种情况带你悟透KMP算法,看完此篇文章就能让你也可以弄明白和敲出KMP算法了!

记录学习过程 1207

金证股份软件测试笔试题面试题

boss上这家公司的HR找到了我,我看了一下这家公司的业务,是我以前做过的基金与证券。还是很感兴趣的,决定去面试看看情况。 (因为只是想去涨面试经验,没有想拿offer,一些回答有点不太对,为后面木有offer埋下伏笔。其实有点亏,毕竟走路过去,而且还花了3个小时) 地点在金证股份科技大楼8楼。 2月25号 主要分为笔试题和面试。 1、笔试题 进来的时候直接给我一份笔试题做,做了一个半小时吧。 分为3道选择题和1道SQL查询题、1道案例设计题 选择题都是考察SQL函数,可能日常生活中没有见过

全村的希望的博客 4451

算法_KMP算法学习笔记

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为Knuth——Morris——Pratt操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串P(长度为m)与主串T(长度为n)的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度为O(m...

博客 384

别再乱调栅极电阻了!手把手教你用示波器调试FOC驱动MOS管,避开EMC和震荡坑

本文详细介绍了FOC驱动中MOS管栅极参数的精准调试方法,涵盖示波器配置、波形特征分析及栅极电阻选型策略。通过实战案例和工程经验,帮助工程师有效解决EMC和震荡问题,提升驱动电路稳定性和效率。

weixin_28728495的博客 503

算法学习笔记—KMP算法

算法学习笔记—KMP算法概述问题描述解决算法BF(Brute-Force)代码(C++):KMP算法分析:代码(C++): 概述 最近遇到一个问题涉及到字符串匹配,所以又重新把 KMP算法学习了下,防止再次忘记,做个笔记备份 下。sofu6的博客讲的挺细致的,我看一遍就理解了。 链接: KMP算法详解-彻底清楚了. 问题描述 字符串模式匹配是老问题了,抽象来说就是在主串中找到模板串,如果成功匹配到...

m0_37685979的博客 320

Unity-Mirror网络框架-从入门到精通之MultipleMatches示例

Multiple Matches 示例主要讲述了如何在使用 Mirror 网路框架时管理多个游戏匹配。以及如何设置一个能够同时支持多个游戏会话的系统,使玩家能够加入他们所选择的比赛,而不是强制他们加入一个单一的匹配。

TxNet 965

KMP算法(学习笔记)

KMP算法总结(南昌理工ACM集训) (这几天想题目想的脑壳疼) 什么是KMP算法 (我准备引用别人的话,讲滴非常好) Knuth-Morris-Pratt字符串查找算法(简称为KMP算法,0.0)可在一个主文本字符串S内查找一个词W的出现位置。 此算法通过运用对这个词在不匹配时本身就包含足够的信息来确定下一个匹配将在哪里开始的发现,从而避免重新检查先前匹配的字符。 为什么我们要用KMP算法呢 我们先介绍一下普通匹配字符串的算法 题目 给定一个模式串S,以及一个模板串P,所有字符串中只包含大

有趣的博客 3454

2026年数字IC设计禾赛科技笔试带答案解析

本文介绍了一份数字IC设计工程师笔试的试卷结构和部分题目解析。试卷包含15道单选题(30分)、10道填空题(20分)和5道简答/编程题(50分),总分100分,考试时长120分钟。单选题涉及同步时序电路、Verilog语法、跨时钟域设计、FPGA优化、存储器层次、功耗优化等知识点;填空题考查环形振荡器、工艺参数、时序约束、LUT结构等基础概念。试题重点考察应聘者对数字电路设计核心概念的理解和实际工程应用能力,特别是针对激光雷达芯片设计中的关键技术点进行考核。

Open 124

学Simulink——十二脉波整流电路(移相变压器)谐波抵消仿真

Y:Δ = 1:√3(若 DC 同压)— 此处同相电压故 220V(Y)=220V(Δ phase)Y(相电压=220V)、Δ(线电压=380V ⇒ 相=220V,30° 移相)可经 Lbal​=0.5mH(平衡电抗)或直接短(大 L_dc 下均流尚可)✅ 直流输出纹波频率 = 12·f_line(vs 6·f_line)直流输出 → Ldc​=50mH→Cdc​=2200µF→R=30Ω。Line‑Line RMS = 380 V(⇒ 相=220V)Vdc​≈1.35⋅380≈513V(同 6‑脉波)

xiaoheshang_123的博客 59

算法学习笔记:KMP 算法

算法学习笔记:KMP 算法1.概述2.例题 1.概述 KMP 算法是一种字符串算法,具体解决的问题为字符串匹配问题: 给出一个模式串 ttt,文本串 sss,请问 ttt 是否为 sss 的字串 / ttt 在 sss 中出现了几次等等问题。 后文中无特殊说明,nnn 为文本串 sss 的长度,mmm 为模式串 ttt 的长度。 2.例题 ...

Plozia 的小窝 1148

2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)

2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)

王老师青少年编程 992

kmp算法学习笔记

目录前言什么是KMP(名词解释)KMP作用 前言 kmP算法有些难理解,为了在学习其他语言的时候能够触类旁通,我打算靠自己的认知,总结一下,方便以后自查自纠。不对的地方,和雷同的地方,还望见谅。 什么是KMP(名词解释) 通过浏览百度词条,发现是由三位学者发明的:Knuth,Morris和Pratt,取了三位学者名字的首字母。所以叫做KMP KMP作用 主要应用于字符串匹配。 ...

晓梦林的博客 579

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

[学习笔记]KMP算法

同样是之前学过了后忘掉了,现在重新做一份学习笔记回顾一下。以及SCUT2022级软院徐睿师兄的PPT。

weixin_43720735的博客 414

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数据结构与算法-学习笔记(13)-KMP算法

菜鸟一枚, 刚刚学习数据结构与算法, 为了加深理解, 所以与同学们分享学习过程。 今天学习的是, KMP算法!!! 上代码: #include <stdio.h> #include <stdlib.h> #include <string.h> void prefix_table(char pattern[],int prefix[],int n) ...

qq_43765237的博客 306

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【KMP算法】个人学习笔记与图解

KMP算法

Oheryon的博客 211

【原创】kmp算法学习笔记

KMP和拓展KMP KMP算法 KMP算法的作用 KMP算法是由三个首字母分别为K,M,P的计算机学家发明的。 主要是拿来解决以下问题的: 有一个长度为M的字符串A和一个长度为N的字符串B。问B这个字符串完整地出现在了A字符串的哪个位置。 当然,一般来说,M远大于N,不过要是不远大于也未尝不行。 引入几个专业的名称,称A串为文本串,B串为模式串,也有称为母串子串、称A为主串,称B为关键字的。 那么...

致上 719
上一篇: 竞赛于 2016-4-19 T1,公司控制(usaco 原题)
下一篇: NOIP2014 Day1 P3 飞扬的小鸟
Forjames
博客等级 码龄11年 1粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值