【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; }