zoukankan      html  css  js  c++  java
  • 【模板】KMP字符串匹配

    Description

    如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置,并输出next数组

    solution

    kmp每一次打出来的都千奇百怪,以后就以今天打的为准了:

    #include <algorithm>
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #define RG register
    #define il inline
    #define iter iterator
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)<(b)?(a):(b))
    using namespace std;
    typedef long long ll;
    const int N=1000005;
    int nxt[N],n,m;
    char a[N],s[N];
    void work()
    {
    	scanf("%s",a+1);
    	scanf("%s",s+1);
    	int p,n=strlen(a+1),m=strlen(s+1);
    	for(int i=2;i<=m;i++){
    		p=nxt[i-1];
    		while(p && s[p+1]!=s[i])p=nxt[p];
    		if(s[p+1]==s[i])nxt[i]=p+1;
    	}
    	p=0;
    	for(int i=1;i<=n;i++){
    		if(s[p+1]==a[i])p++;
    		else{
    			while(p && s[p+1]!=a[i])p=nxt[p];
    			if(s[p+1]==a[i])p++;
    		}
    		if(p==m)printf("%d
    ",i-m+1);
    	}
    	for(int i=1;i<=m;i++)printf("%d ",nxt[i]);
    }
    
    int main()
    {
    	work();
    	return 0;
    }
    
    
  • 相关阅读:
    POJ3421(质因数分解)
    POJ2236(并查集入门)
    POJ3111(最大化平均值)
    POJ2976(最大化平均值)
    POJ3104(二分搜索)
    POJ3258(最大化最小值)
    POJ2456(最大化最小值)
    POJ1063Cable master(二分搜索)
    Numpy模块(一)
    Django简介
  • 原文地址:https://www.cnblogs.com/Yuzao/p/7799690.html
Copyright © 2011-2022 走看看