KMP随笔 + 模板

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

Update:我这口胡的是什么啊=-=我都看不懂了 算了算了给个链接这个讲的特好

2024.12.03 Upd:首先观看这个小视频,它除了匹配失败其他讲的都很好,看到六分钟差不多了。

KMP其实最主要的就是如何求next数组。首先理解前缀、后缀、部分匹配值的概念后,我们应该已经知道了这个过程是从模式串T的 从头开始的子串开始逐一增加长度以对应next数组的每一位的。我们首先要想到,这个过程就和主串S匹配模式串T几乎一样,只不过这个时候的“主串”是T,其“模式串”是从T开头逐渐拉长的T的子串,相当于自己和自己的越来越大部分匹配。如果能理解到这层面,那再做一点思考应该自己就能明白了。大部分人其实就是这部分没理清楚,具体来说就是:

Q:我知道有了next数组后就能进行那个什么什么KMP的主串里匹配模式串了,但是我的next数组怎么求?

A:你都知道怎么匹配了,你求next数组的时候你已经有next数组的next数组了,用next数组的next数组求出next数组你不就得到next数组了?(指求第i位的时候i-1位next数组已经求出来了,这部分数组就是求next用到的,而且next[1]=0迟早全都推得出)

Q:?神金

如果不明白就可以继续看。

如何利用前一个状态推导当前状态呢?我们很容易发现当前状态如果变长了,那就一定是上一位的部分匹配小串串的i位后面一位匹配上了。比如ABCAB已经匹配到了长度为2的AB串,那么ABCAB?的?对应前缀AB后的C时才会增加。

除此之外就是匹配失败的部分匹配值如何倒退了。匹配失败时,目前是有长为length的部分已经匹配上,由于不能继续往后接着匹配,所以匹配好的后缀已经没用了,我们关心的是前缀。前缀由于匹配不上所以需要回退,回退的流程就和ST串匹配时一样。但此时我们仅需利用已经匹配好的 前面部分的next数组就能进行回退,让此时的部分匹配串变成部分匹配串内的部分匹配串,然后此时我们就可以通过新的这个小串重新与当前主串第i位重复上一自然段中的那种对最新一位比较情况,就这样一直通过next数组找T后缀和此时T子串前缀的部分匹配串匹配,最后变成最小的空串与第i位比较仍然不成功,就触发大保底next[i]=0了。

以下是很久以前写的,本人也看不懂,有需要直接看例题和代码即可。

-----------------------------------------------分割线-----------------------------------------------

来讲讲KMP

First......读入两字符串后 将将被搜索的关键字 先进行自我配对

            长度1..2..3......len(串) - 1        意为 字符串前x个字符的 前缀 与 后缀 相等的最大长度

            此处注意 前缀 和 后缀 各自的长度 似乎不能等于原串的样子=-=

            每个长度都要保存下来 可存到某一数组里 通常用 next fail 等名称定义 依据是他的作用

Fa♂Q : 这个解释模模糊糊看起来怪怪的存长度的数组...... 有什么用

Ans~ : 之后查找长度的时候会用到~

            作用是 当两个字符串比着比着 突然对不上了的时候

            他就可以挺♂身而出 给将被搜索的关键字跳回去 至于总串嘛他太懒了懒得改

            那关键字怎么改呢

Second...说起来是改 实际上是跳

            首先 你可以通过存两个字符串正在比的地方(用int一类 或 指针) 找到 关键字比到哪儿了

            For instance 以 char[1] 开始 设总串指针为 i 关键字指针为 j

            关键字比到第666位了 然后第667位不一样 则 i = 666

            先设该666位字符是abcab......abcabd 红色的是第667个

            此时总串比到2333位 是......abcabcabc 红色的是第2334个 j = 2333

            哈 通过next[667] = 5 你找到了关键字前666位的前缀和后缀 正是abcab

            因此直接跳把关键字的指针 跳到 2 此时 i = 2

            此时比较关键字第 3 位 c 和 总串第2334位 c 相等

            LOLOLOL 我们就可以开心地比下去啦

            如果此时两字符还不同 通过 next 数组 找到 next[i] 继续跳 直到跳到头 i = 0 就相当于重新匹配了=-= 从零开始的搜索......

Useless notes:

            用 string 读的字符串 和 下标0开头的 char 类型的 KMP 部分几乎是一样的

            然后 下标1 开头1 的 char 又 有所改变=-=

            为防止思路混乱 在此将三篇都记下来(前两者转换只用改改 类型 和 串长求法 而已)

            其中1下标char跑得非常非常慢,但是下标换成0就没事了 原因不详 实在是太毒瘤了

模板题 洛谷P3375

Tip:因为懒得打子程序直接堆一起啦~

sky_killed(被天杀的) char[1] 开头——

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAX = 1 << 21;
char i[MAX],j[MAX];
int next[MAX];
int main()
{
    int b;
    scanf("%s%s",i + 1,j + 1);
    int li = strlen(i + 1);
    int lj = strlen(j + 1);
        for (int a = 2; a <= lj; a++)//建立next数组
        {
            while (b && j[a] != j[b + 1]) b = next[b];
            if (j[a] == j[b + 1]) ++b;
            next[a] = b;
        }
    b = 0;
        for (int a = 1; a <= li; a++)//开始匹配
        {
            while (b > 0 && i[a] != j[b + 1]) b = next[b];
            if (i[a] == j[b + 1]) ++b;
            if (b == lj) printf("%d\n",a - b + 1),b = next[b];
        }
        for (int a = 1; a <= strlen(j + 1); a++) printf("%d ",next[a]);//烦人的题目要求输出next数组=-=
    return 0;
}

总共 T 三个点~

normal char[0] 开头——

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAX = 1 << 21;
char i[MAX],j[MAX];
int next[MAX];
int main()
{
    int b;
    scanf("%s%s",i,j);
    int li = strlen(i);
    int lj = strlen(j);
        for (int a = 1; a < lj; a++)//建立next数组
        {
            while (b && j[a] != j[b]) b = next[b];
            if (j[a] == j[b]) ++b;
            next[a + 1] = b;
        }
    b = 0;
        for (int a = 0; a < li; a++)//开始匹配
        {
            while (b && i[a] != j[b]) b = next[b];
            if (i[a] == j[b]) ++b;
            if (b == lj) printf("%d\n",a - b + 2),b = next[b];
        }
        for (int a = 1; a <= lj; a++) printf("%d ",next[a]);
    return 0;
}

总 300ms~

Useful string ——

Tip:AC自动机要用string哦 char慢死=-=

      好吧也可能是我自己的问题(就是你自己的问题不要推卸责任)

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int next[1 << 21];
int main()
{
    int b;
    string i,j;
    cin >> i;
    cin >> j;
    int li = i.size();
    int lj = j.size();
        for (int a = 1; a < lj; a++)//建立next数组
        {
            while (b && j[a] != j[b]) b = next[b];
            if (j[a] == j[b]) ++b;
            next[a + 1] = b;
        }
    b = 0;
        for (int a = 0; a < li; a++)//开始匹配
        {
            while (b && i[a] != j[b]) b = next[b];
            if (i[a] == j[b]) ++b;
            if (b == lj) printf("%d\n",a - b + 2),b = next[b];
        }
        for (int a = 1; a <= lj; a++) printf("%d ",next[a]);
    return 0;
}

总 616ms~ 慢了点呢

量子密钥分发系统的工程实践(四):FPGA在后处理中的核心实现与优化 本文深入探讨了FPGA在量子密钥分发(QKD)系统后处理中的核心实现与优化策略。文章详细拆解了FPGA如何高效完成原始密钥提取、误码协商和私密放大等关键任务,并分享了流水线设计、资源复用及存储器架构优化等工程实践“心法”,旨在解决高速、实时QKD系统中的性能瓶颈,提升密钥生成率。 阅读详情

相关推荐

【STM32】STM32F103C8T6多串口通信实战:3个USART并行收发与中断处理优化

本文详细介绍了STM32F103C8T6多串口通信的实战技巧,包括3个USART模块的并行配置、中断优先级优化及数据收发冲突规避策略。通过硬件初始化步骤、中断优先级设置和双缓冲区实现等方案,有效解决了多串口通信中的数据错乱问题,提升系统稳定性与效率。

weixin_42526417的博客 168

力扣随笔——KMP算法模板

代码: vector<int> nxt(goal.size(), 0); int i=1, j=0; // 求next数组 for(; i<goal.size(); ++i){ while(j>0 && goal[i] != goal[j]){ j = nxt[j-1]; } if(goal[i] == goal

Overvautious的博客 180

ROS2_Moveit2_Ur5e_Grasp项目详解(二):核心模块功能解析

本文深入解析了ROS2_Moveit2_Ur5e_Grasp项目的核心模块功能。重点阐述了OctoMap建图模块如何为机械臂提供实时三维环境感知,并详细介绍了Robotiq夹爪与MoveIt2的集成控制、UR5e的运动规划策略,以及视觉模块如何协同工作,最终实现从目标检测到动态抓取的完整闭环。

weixin_29254029的博客 109

AC自动机 后缀数组 随笔

天天一头雾水,真是头大呢; 也祝自己生日快乐7.12,真是和海亮美好的回忆; AC自动机:自动A题的机器;显然这样说是错的; 这个东西 我只想写一下自己的理解 然后一些总结; 首先 它是具有KMP性质的东西,但是又是有区别的; KMP的Next数组是用来最长公共前后缀,而AC自动机的fail指针是用来搞相同后缀即可; 因为KMP只对一个模式串做匹配,而AC自动机要对多个模式串...

dengcuan6219的博客 247

从指令到坐标:深度解析307系列基站定位的AT指令实战与排错

本文深度解析了ML307系列模组基站定位的AT指令实战应用与排错方法。重点剖析了AT+MLBSCFG和AT+MLBSLOC两条核心指令的配置、执行流程及异步响应机制,并针对高德与OneOs两种主流定位服务提供了完整的配置指南。文章结合常见错误码(如126、127)和硬件注意事项,分享了确保定位成功的实战经验与稳健的程序框架。

weixin_29057695的博客 487

SocraticLM: Exploring Socratic Personalized Teaching with Large Language Models

大型语言模型(LLM)被认为是推进智能教育的一项关键技术,因为它们展示了深入理解教学场景和为学生提供个性化指导的潜力。然而,当前个性化教学中基于LLM的应用主要遵循“问答”范式,学生被动地获得答案和解释。在本文中,我们提出了苏格拉底式教学模式(SocraticLM ),它实现了一种苏格拉底式的“发人深省”的教学范式,实现了真正的课堂教师的角色,让学生积极参与到真正掌握解决问题所需的思考过程中。

weixin_43961909的博客 2882

silent 闲谈随笔2

今天练习的主要是字符串的处理,哈希和kmp算法 字符串的处理都是一些比较简单的题,所以做完例题就去写哈希了,因为之前是没有学过的,这次哈希是第一次学,而且前几天也只是打了个模板,所以刷了两题就是极限了,不过哈希的题我现在第一眼都看不出来是哈希,总觉得用的算法可以应付应付 kmp算法,我在查博客的时候,看到一篇博客说,kmp算法又称看毛片算法,给我笑尿了,真是个人才,下午吃饭的时候提到这个,某人还说,若是没有k,那不就成了mp算法了,这太好玩了,再谈下题目,kmp算法第一题是正正经经的字符串匹配,后面俩都是考

silentdeathdance的博客 123

光模块数字诊断监控(DDM)功能

DDM(Digital Diagnostic Monitoring)数字诊断监控,由行业组织SFF Committee制定,遵循SFF-8472多源协议定义的标准参数而工作,规范了光模块和网络设备的软硬件所需遵循的标准数值或范围,确保了网络设备供应商和光模块供应商之间所提供产品的互操作性不同。:通过监测激光器的偏置电流来预测激光器的劣化,从而确保在故障发生之前将业务切换到备用链路上或替换有可能故障的光模块,因此起到了预测光模块寿命的作用。光模块DDM信息可以通过SNMP读取光模块的接收光功率和发射光功率。.

光模块的博客 2299

silent 闲谈随笔3

今天改的是昨天的进阶版,字典树和ac自动机 字典树是一个很奇妙的数据结构,它对于每一个出现的字符,只存一次,对于不同的字符串比如,abc和abd,那么a是根节点,b是a的子节点,然后,c和d是兄弟,都是b的儿子,还有一种01字典树,只存0和1,是解决最大异或值问题的绝对利器,只要把每个数换成二进制转到字典树里,传进去的时候匹配一下,获得最大异或值,比如获得了一个110的二进制数,那么从头位开始匹配,就是取到1之后取反,然后看这个0是否存在于字典树中,存在则加上这个1, ac自动机我是干不动啦,只有先前的模板

silentdeathdance的博客 125

学习STM32的无人机控制

下面是一个基于STM32的无人机控制的简单示例代码,包括四旋翼的PID控制、遥控器信号解析和电机控制。本示例以STM32F103系列为例,使用Keil C编译器进行开发。

qq_67153941的博客 706

腾讯音乐 QQ音乐商业化客户端开发工程师:岗位深度解析与面试攻略

腾讯音乐QQ音乐商业化客户端开发工程师岗位要求3年以上Android开发经验,熟练掌握Kotlin/Java及跨端开发技术。核心职责包括QQ音乐客户端功能开发、架构优化、性能提升及技术攻关。岗位要求计算机相关本科以上学历,具备完整项目开发经验,熟悉TCP/IP等网络协议,能独立解决复杂技术问题。面试重点考察项目经验、架构设计、性能优化及新技术研究能力,建议候选人准备具体案例,量化成果,并熟悉Flutter等跨端技术。该职位强调技术深度与产品思维的结合,需展现扎实的编程基础、问题解决能力和团队协作精神。

郑伟强dev的专栏 365

随笔03 笔记整理

关于我的考研与Web安全类博文整理~🥝🥝

weixin_42789937的博客 1663

手把手教你学Simulink——基于Simulink的固态变压器(SST)多级协同控制

摘要:本文详细介绍了基于Simulink的固态变压器(SST)多级协同控制方法。SST作为新一代智能电网核心设备,通过AC-DC整流、DC-DC隔离和DC-AC逆变三级架构实现电能高效转换。针对多级耦合难题,提出能量-功率协同控制策略:纵向解耦电压环与功率前馈,横向联动级间功率指令。在Simulink中搭建10kV/400V系统模型,实现直流母线电压波动<2%的动态性能。特别设计了负载突变时的三级协同机制,通过虚拟惯性算法和前馈控制实现快速响应。文章包含完整的建模步骤、控制推导和参数设置,为电力电子工

MHD0815的博客 192

随笔归档

UPD:18.4.28因为最近做的几道trie已经明显不是字符串算法的trie了,于是把trie同时扔到了字符串算法和数据结构里面。 一.做题网站 POJ BZOJ CF HDU ZOJ UOJ 洛谷 其他OJ —————————————————————— 二.模板 模板 —————————————————————— 三.知识点 图论   Tarjan相关   2...

weixin_34090643的博客 69

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【2017/12/05】随笔

兜兜转转,在ACM瞎转悠了两年多了,作为一个弱校的弱鸡差不多想往圈子外踏出半只脚了。前天打完了CCPC Final,也是最后一场比较“大只”的比赛吧,接下来对于竞赛上该放放了,总是没有理由再逃避专业课和专业作业啦~_~。   看着我以前写过的博客,回忆这两年多的时光,时间走的太快~~~   两年前作为大一新生的我来到这所学校,作为一个到了大学都不知道计算机是干啥的人,秉着好奇心和一时积极向上的

学无纸巾 381

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

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

2021寒假第一周

2021寒假第一周模板题目 模板 完善KMP与扩展KMP 题目 CF 1051 E CF 535 E CF 652 E

micaudience的博客 247

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

解题报告——AC自动机

最近真的太上头了,无论什么方面的,赶紧冷静下来,一晃已经好几天没有更新博客了,寒假的时候搞比赛,补题补得非常痛苦,一天2道题目已经是常态了,还不能保证做对。。。刚开学这段时间还挺闲的,寒假也没闲着搞学校的课程,现在有点基础可以稍微浪一下,多搞点题目来做,然后上周就连续几天熬夜打cf,结果还是不咋地。。。

xiaoyu524的博客 719

linux怎么查看tomcat错误日志,Linux下查看Tomcat运行日志

查看方式1、先切换到:cd usr/local/tomcat5/logs2、tail -f catalina.out3、Ctrl+c 是退出tail命令/alt+E+R重置部署常用指令1、ps aux | grep tomcat 查看tomcat 进程ps -ef|grep java  查看Tomcat是否已关闭2、kill -9 进程号3、./startup.sh && tai...

weixin_29505425的博客 5767

目录与学习计划

学习计划和目录

qq_42852687的博客 520

测试

u011276914的专栏 目录视图摘要视图订阅管理博客写新文章   测试 [草稿] 2014-10-02 11:18 3人阅读 评论(0) 收藏 编辑 删除 版权声明:本文为博主原创文章,未经博主允许不得转载。 给我写信 上一篇HDU 4285 circuit

u011276914的专栏 656

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 14

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 436

【算法拾光】模拟|外观数列 + 数青蛙

本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。

wuqingyigexiaoba的博客 362
上一篇: 树链剖分+线段树维护 的基础操作 较详细原理 + 普(cai)通(ji)模板
下一篇: AC自动机 详解 + 模板
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值