#include<iostream>
#include<string.h>
using namespace std;
char a[10000008],b[10000008];
int pi[10000008];
int len1,len2;
void BuildPi(char b[],int len){
int i=-1,j=0;
pi[0]=0;
while(j<len){
if(b[i+1]==b[j+1]){
i++;j++;
pi[j]=i+1;
}
else {
if(i==-1){
j++;
pi[j]=0;
}
else i=pi[i]-1;}
}
}
void KMP(char a[],char b[],int pi[],int len1,int len2){
int i=-1,j=-1;
while(i<len1){
if(a[i+1]==b[j+1]){
i++;j++;
if(j==len2-1)cout<<i-len2+2<<endl;
}
else{
if(j==-1){
i++;
}
else j=pi[j]-1;
}
}
}
int main(){
cin>>a;
len1=strlen(a);
cin>>b;
len2=strlen(b);
BuildPi(b,len2);
KMP(a,b,pi,len1,len2);
for(int i=0;i<len2;i++){
cout<<pi[i]<<" ";
}
return 0;
}
KMP字符串匹配模板 洛谷P3375
最新推荐文章于 2026-01-03 10:47:33 发布
该博客详细介绍了KMP字符串匹配算法的实现过程,包括`BuildPi`函数用于计算部分匹配表,以及`KMP`函数进行实际的字符串匹配。在主函数中,通过输入两个字符串并调用KMP算法,输出了子串在主串中的起始位置。此外,还展示了部分匹配表的输出。此博客对于理解字符串处理和算法设计具有指导意义。
1019

被折叠的 条评论
为什么被折叠?



