logo
carrot

太阳当空照,花儿对我笑

KMP字符串

12/15/2022, 3:53:28 PM
  1. 首页
  2. /
  3. 正文
#include <iostream>
using namespace std;

const int N = 1000010;
int ne[N];
string s,p;

int main(){
    int a,b;
    cin>>a>>p>>b>>s;
    int i=1,j=0;
    while(i<p.size()){
        // ne[i]代表从0-i之间最大相同前后缀的长度 即 前缀后的第一个下标
        // 如果从j处不匹配了,说明0-(j-1)是匹配的,回溯0-(j-1)前缀即可
        if(p[i]==p[j]){
            ne[i]=j+1;
            i++;
            j++;
        }else{
            if(j==0)i++;
            else j=ne[j-1];
        }
    }
    i=0,j=0;
    while(i<s.size()){
        // ne[i]代表从0-i之间最大相同前后缀的长度 即 前缀后的第一个下标
        if(s[i]==p[j]){
            i++;
            j++;
        }else{
            if(j==0)i++;
            else j=ne[j-1];
        }
        if(j==p.size()){
            //success
            printf("%d ",i-j);
            j=ne[j-1];
        }
    }
    return 0;
}
热门文章
标签云
© 2021 Copyright 本站由 upyun 提供储存服务