【sunday算法】玄学字符串匹配

和KMP相似,用于字符串的匹配,貌似平均复杂度比KMP快,也比KMP更好理解。

大概意思是:

如果串b被串a包含,那么串a此时与串b匹配的部分一定一样

所以如果从开头开始匹配到不同处时,在a串找中此时a串中对应的b串末尾下一位最靠右出现的位置,记作m

如果找不到,直接跳过这一段(显然无法在这一段里找到答案)

如果找到,就让b串中这个位置与m对齐

大概是这么一个意思:

Step1:比较至第二位时发现失配,比较两个染色位置的字符,发现相同

Step2:将T字符从左往右数的第一个与S[4]相同的字符移至s[4]的下面,这样可以保证不会错过匹配项。(相关信息已存在asc数组中)。 
这里写图片描述

以此类推,不断比较。

大概就是这个意思

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

char a[1000010],b[10010];
int la,lb,asc[256];

void sunday()
{
    for(int i=0;i<=255;++i)
        asc[i]=lb+1;
    for(int i=1;i<lb;++i)
        asc[b[i]]=lb-i;
    int i=0,j=0;
    while(i<la&&j<lb)
    {
        for(;j<lb&&i+j<la&&a[i+j]==b[j];j++);
        if(j==lb)
        {
            printf("%d\n",i+1);
            i++;
            j=0;
            continue;
        }
        if(i+lb>=la) return ;
        i+=asc[a[i+lb]];
    }
    return ;
}

int main()
{
    scanf("%s%s",a,b);
    la=strlen(a+1);
    lb=strlen(b+1);
    sunday();
    return 0;
}

 

posted @ 2017-05-02 19:13  减维  阅读(359)  评论(0编辑  收藏  举报