【字符串处理】关于KMP算法输出的是什么&代码
输入:
ABCDABTBD_TISABCDABC
ABCDABC
q为当前nxt处理的模版文本串下标;
k为“失配时去哪里”,详情请看注释。
--------------我是求完nxt的分界线------------------
q为当前文本串判断到哪里;
nxt为“失配时去哪里”。
输出:
nxt[q(1)]=k(0);
nxt[q(2)]=k(0);
nxt[q(3)]=k(0);
k(0)++;
nxt[q(4)]=k(1);
k(1)++;
nxt[q(5)]=k(2);
k(2)++;
nxt[q(6)]=k(3);
next数组求解完毕
q(0)++;
q(1)++;
q(2)++;
q(3)++;
q(4)++;
q(5)++;
q=nxt[q-1](0);
q=nxt[q-1](0);
q(0)++;
q(1)++;
q(2)++;
q(3)++;
q(4)++;
q(5)++;
q(6)++;
return i(19)-lp(7)+1;
pos=13
-------------------我是代码分界线------------------------

1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 string T,P; 5 int nxt[1000002]; 6 void mkNxt(){ 7 nxt[0]=0; 8 int k,q; 9 for(k=0,q=1;q<P.length();q++){//遍历模版串以求出next数组 10 while(k>0&&P[k]!=P[q]){ 11 k=nxt[k-1];//如果遇到“已经匹配过超过一个字符”又不匹配的地方,返回上一次求出的next,找到第二个已经匹配的地方 12 } 13 if(P[k]==P[q]){//如果成功就k++ 14 k++;//换句话说,k代表着当前能够匹配的最大长度 15 } 16 nxt[q]=k;//记录 17 } 18 19 } 20 void KMP(){ 21 int q=0; 22 for(int i=0;i<T.length();i++){//文本T和模版P匹配 23 while(q>0&&P[q]!=T[i]){//如果不匹配就拿出“最长前后缀表” 24 q=nxt[q-1]; 25 } 26 if(P[q]==T[i]){//匹配一个就加大长度 27 q++; 28 } 29 if(q==P.length()){ 30 cout<<i-q+2<<endl;//完全匹配就输出 31 } 32 } 33 } 34 int main(){ 35 cin>>T>>P; 36 mkNxt(); 37 KMP(); 38 for(int i=0;i<P.length();i++){ 39 cout<<nxt[i]<<" "; 40 } 41 }
这份代码在洛谷上提交通过了。
地址是 https://www.luogu.org/problemnew/show/P3375
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!