• 【模板】KMP与MP的区别(洛谷P3375)


    学KMP的时候巨佬说我这写的是MP,仔细去查了查资料,才发现了区别。
    洛谷这道题用KMP是解决不了的,KMP的nxt数组和MP的nxt数组略有不同。
    https://www.cnblogs.com/yjiyjige/p/3263858.html
    这位大佬写的过程很清楚,但是程序不是怎么看得懂,而且实际放到洛谷的题上测应该也是过不了的(应该。
    直接放程序8

    #include<bits/stdc++.h>
    #define rep(i,k,n) for(int i=k;i<=n;i++)
    #define pb push_back
    using namespace std;
    const int maxn=1000005;
    int n,m,Knxt[maxn],Mnxt[maxn];
    char str[maxn],ptr[maxn];
    vector<int> ans;
    void KMP_cal_nxt()
    {
    	int k=-1;Knxt[0]=-1;
    	rep(i,1,m-1)
    	{
    		while(k>-1 && ptr[k+1]!=ptr[i]) k=Knxt[k];
    		if(ptr[k+1]==ptr[i]) k++;
    		if(ptr[k+1]==ptr[i+1]) Knxt[i]=Knxt[k];
    		else Knxt[i]=k;
    	}
    }
    void MP_cal_nxt()
    {
    	int k=-1;Mnxt[0]=-1;
    	rep(i,1,m-1)
    	{
    		while(k>-1 && ptr[k+1]!=ptr[i]) k=Mnxt[k];
    		if(ptr[k+1]==ptr[i]) k++;
    		Mnxt[i]=k;
    	}
    }
    void KMP()
    {
    	KMP_cal_nxt();
    	int k=-1;
    	rep(i,0,n-1)
    	{
    		while(k>-1 && ptr[k+1]!=str[i]) k=Knxt[k];
    		if(ptr[k+1]==str[i]) k++;
    		if(k==m-1) ans.pb(i-m+2),k=Knxt[k];
    	}
    }
    void MP()
    {
    	MP_cal_nxt();
    	int k=-1;
    	rep(i,0,n-1)
    	{
    		while(k>-1 && ptr[k+1]!=str[i]) k=Mnxt[k];
    		if(ptr[k+1]==str[i]) k++;
    		if(k==m-1) ans.pb(i-m+2),k=Mnxt[k];
    	}
    }
    
    int main()
    {
    	scanf("%s%s",str,ptr);
    	n=strlen(str);
    	m=strlen(ptr);
    	MP_cal_nxt();KMP();//用了MP的nxt数组,题目要求,但是是用KMP函数匹配
    	rep(i,0,(int)ans.size()-1)
    	printf("%d
    ",ans[i]);
    	rep(i,0,m-1) printf("%d ",Mnxt[i]+1);
    	return 0;
    }
    
  • 相关阅读:
    数组返回NULL绕过
    69.x的平方根
    1277.统计全为1的正方形子矩形
    221.最大正方形
    572.另一个树的子树
    983.最低票价
    98.验证二叉排序树
    53.最大子序和
    5386.检查一个字符串是否可以打破另一个字符串
    5385.改变一个整数能得到的最大差值
  • 原文地址:https://www.cnblogs.com/NightRaven/p/10554401.html
Copyright © 2020-2023  润新知