kmp板子+扩展kmp

洛谷模板题
求出s2在s1中所有出现的位置,以及next【i】数组
next数组是指a的前缀和以i结尾的a的后缀的最大匹配

#include<cstdio>
#include<cstring>
const int maxn=1000005;
int next[maxn],f[maxn];
int main(){
   
	char a[maxn],b[maxn];//b是长的,a是短的
	scanf("%s%s",b+1,a+1);
	int n=strlen(a+1);
	int m=strlen(b+1);
	next[1]=0;
	for(int i=2,j=0;i<=n;i++){
   
		while(j>0&&a[i]!=a[j+1])	j=next[j];
		if(a[i]==a[j+1])	j++;
		next[i]=j;
	}
	for(int i=1,j=0;i<=m;i++){
   
		while(j>0&&(j==n||b[i]!=a[j+1]))	j=next[j];
		if(b[i]==a[j+1])	j++;
		f[i]=j;
		if(f[i]==n)	printf("%d\n",i-n+1);
	}
	
	printf("%d",next[1]);
	for(int i=2;i<=n;i++)
		printf(" %d",next[i]);
	return 0;
} 

扩展kmp
next数组是指a的前缀和以i为开始的前缀的最大匹配.

const int maxn=100010;
int next[maxn],ex[maxn];
void getNext(char *str){
   
    int i=0,j,po,len=strlen(str);
    next[0]=len; 
    while(str[i]==str[i+1]&&i+1<len) i++; 
	next[1]=i; 
    po=1; 
    for(i=2;i<len;i++){
   
        if(next[i-po]+i<next[po]+po) 
            next[i]=next[i-po];
        else{
   
            j=next[po]+po-i;
            if(j<0) j=0; 
            while(i+j<len&&str[j]==str[j+i]) j++; next[i]=j;
            po=i; 
        }
    }
}
void EXKMP(char *s1,char *s2){
   
    int i=0,j,po,len=strlen(s1),l2=strlen(s2);
    getNext(s2); 
    while(s1[i]==s2[i]&&i<l2&&i<len) i++; 
	ex[0]=i;
    po=0; 
    for(i=1;i<len;i++){
   
        if(next[i-po]+i<ex[po]+po) 
            ex[i]=next[i-po];
        else{
   
            j = ex[po]+po-i;
            if(j<0) j=0; 
            while(i+j<len&&j<l2&&s1[j+i]==s2[j]) j++; ex[i]=j;
            po=i; 
        }
    }
}    
全部评论

相关推荐

不愿透露姓名的神秘牛友
2025-12-04 02:00
offer1:字节跳动(北京)-&nbsp;后端开发岗-&nbsp;薪资:总包42w(基本工资30w+绩效6w+年终奖6w),15薪,加班费按法定标准发放-&nbsp;福利:公积金按12%缴纳,无宿舍,每月住房补贴2000元,餐补1500元,每年2次体检,免费健身房-&nbsp;工作强度:996是常态,忙的时候可能到凌晨,团队节奏快,压力大-&nbsp;其他:平台大,技术氛围浓,晋升路径清晰,对转行选手来说履历加分多,但北京生活成本高,租房压力大offer2:美团(上海)-&nbsp;客户端开发岗-&nbsp;薪资:总包38w(基本工资26w+绩效5w+年终奖7w),14薪,加班无加班费,可调休-&nbsp;福利:公积金按10%缴纳,无宿舍,每月住房补贴1800元,餐补800元,每年1次体检,节日福利丰富-&nbsp;工作强度:995为主,偶尔周末加班,项目紧急时会通宵,整体压力中等-&nbsp;其他:公司业务成熟,行业地位稳固,客户端岗位需求稳定,上海生活节奏比北京稍缓,但租房成本仍较高offer3:网易(杭州)-&nbsp;测试开发岗-&nbsp;薪资:总包32w(基本工资22w+绩效4w+年终奖6w),13薪,加班较少,无加班费-&nbsp;福利:公积金按12%缴纳,提供员工宿舍(单人间,前两年免费,第三年按市场价5折),每月餐补1000元,每年1次体检+1次旅游补贴-&nbsp;工作强度:965为主,几乎无强制加班,团队氛围轻松,摸鱼文化盛行-&nbsp;其他:杭州生活成本低于北上,宿舍省房租,测试开发岗入门难度低,适合转行过渡,但技术成长速度可能不如开发岗,未来跳槽竞争力未知本人情况:传统工科转行,编程基础一般,想快速提升技术能力,同时也希望工作生活能平衡,未来不确定是否留在一线城市。有没有同款转行选手或互联网前辈给点建议呀?
森七菜:梦到什么说什么属于是
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务