codeVS1204 寻找子串位置

KMP。

一直没有一个裸kmp,根本看不懂kmp。。。//蒟蒻本性。

kmp的部分匹配值next[j],在这个实现中的意思是,如果b[j+1]和a[i]失配,j=next[j]。

就是不断返回直到b[j+1]==a[i]。

计算的话,就用自己匹配自己吧。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 200 + 10;

char a[maxn],b[maxn];
int next[maxn];
int n,m,j;


int main() {
    scanf("%s%s",a+1,b+1);
    n=strlen(a+1),m=strlen(b+1);
    j=0;
    for(int i=2;i<=m;i++) {
        while(j && b[j+1]!=b[i]) j=next[j];
        if(b[j+1]==b[i]) j++;
        next[i]=j;    
    }
    j=0;
    for(int i=1;i<=n;i++) {
        while(j && b[j+1]!=a[i]) j=next[j];
        if(b[j+1]==a[i]) j++;
        if(j==m) { //匹配成功 
            printf("%d\n",i-m+1);
            break;
        }
    }
    return 0;
}
posted @ 2016-05-24 16:38  invoid  阅读(240)  评论(0编辑  收藏  举报