zoukankan      html  css  js  c++  java
  • 831. KMP字符串

    给定一个模式串S,以及一个模板串P,所有字符串中只包含大小写英文字母以及阿拉伯数字。

    模板串P在模式串S中多次作为子串出现。

    求出模板串P在模式串S中所有出现的位置的起始下标。

    输入格式

    第一行输入整数N,表示字符串P的长度。

    第二行输入字符串P。

    第三行输入整数M,表示字符串S的长度。

    第四行输入字符串M。

    输出格式

    共一行,输出所有出现位置的起始下标(下标从0开始计数),整数之间用空格隔开。

    数据范围

    1N1041≤N≤104
    1M1051≤M≤105

    输入样例:

    3
    aba
    5
    ababa
    

    输出样例: 

    0 2

    #include<iostream>
    
    using namespace std;
    
    const int N = 1e4 + 10,M = 1e5 + 10;
    
    //p是我们的模板串,s是我们的模式串
    char p[N],s[M];
    int n,m;
    //next数组
    int ne[N];
    
    int main(){
        cin >> n >> p + 1 >> m >> s + 1;   
        
        //i从2开始因为next[1] = 0,就是如果第一个字母失败了就从0开始所以next[1]不用算,i直接从2开始 
        for(int i = 2,j = 0;i <= n;i++){
            //j有退路并且i 和 j+1不匹配,
            while(j && p[i] != p[j + 1]) j = ne[j];
            if(p[i] == p[j + 1]) j++;
            ne[i] = j;
        }
        
        for(int i = 1,j = 0;i <= m;i++){
            while(j && s[i] != p[j + 1]) j = ne[j];
            if(s[i] == p[j + 1]) j++;
            if(j == n){
                cout << i - n << " ";
                j = ne[j];
            }
        }
        return 0;
        
    }
    

      

  • 相关阅读:
    内存可用性判断 IsBadCodePtr IsBadReadPtr 等等
    部署到Linux使用VS Code 开发.NET Core 应用程序
    Gulp.js简介
    net WebApi中使用swagger
    深入理解
    软件框架
    重拾linux
    Linux创建修改删除用户和组
    Linux 之 rsyslog
    Lua 解释器
  • 原文地址:https://www.cnblogs.com/luyuan-chen/p/11645589.html
Copyright © 2011-2022 走看看