P3375 【模板】KMP

题目来自洛谷网站:

P3375 【模板】KMP_第1张图片

思路:

从题目名字知道这是 KMP 模板题目,对于 KMP 算法,就两步,1、构造next数组。2、在s1中找到s2出现的位置。

KMP代码:

#include
using namespace std;
const int N = 1e6+10;

char s1[N], s2[N];
//全局变量名字不能定义为next 
//C++标准库中有一个函数名字是next
int next1[N]; //ne数组

int main(){
    //从数组下标1开始读入数据
    cin >> (s1+1); cin >> (s2 + 1);
    int n = strlen(s1+1);
    int m = strlen(s2+1);
    
    //KMP算法模板
    //构造next数组
    next1[1] = 0;
    for(int i = 2, j = 0; i <= m; i++){
        //回退
        while(j && s2[i] != s2[j+1]) j=next1[j];
        if(s2[i] == s2[j+1]) j++;
        next1[i] = j;
    }
    //在s1中查找s2
    for(int i = 1, j = 0;i <= n; i++){
        while(j && s1[i] != s2[j+1]) j=next1[j];
        if(s1[i] == s2[j+1]) j++;
        if(j == m){
            printf("%d\n", i-j+1);
        }
    }
    
    for(int i = 1; i <= m; i++){
        cout << next1[i] << " ";
    }
    
    return 0;
}

你可能感兴趣的:(算法)