zoukankan      html  css  js  c++  java
  • 【模板】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;
    }
    
  • 相关阅读:
    select选中值传递到后台action中
    select into from 与insert into select from区别
    存储过程
    layer
    下拉框两级联动
    无限纠结——Zedboard上跑ubuntu详解
    静态时序分析SAT
    设计模式-(构型模式)
    内存断点调试的原理
    C语言中使用静态函数的好处
  • 原文地址:https://www.cnblogs.com/NightRaven/p/10554401.html
Copyright © 2011-2022 走看看