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

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 100010, M = 1000010;
    int ne[N];
    char s[M], p[N];
    int n, m;
    
    int main() {
        cin >> n >> p + 1 >> m >> s + 1;
        //  ababadsdsab  ne[4] = 2 前缀ab后缀ab  ne[5] = 3 前缀aba后缀aba
        // ne[i]数组表示字符串p选取长度为前i个的子串时的最长公共前后缀 前后缀不能为子串本身
        // 所以长度为1时ne[1] = 0; 下面循环i从2开始
        for(int i = 2, j = 0; i <= n; i++) 
        {
            while(j && p[i] != p[j+1]) j = ne[j];
            if(p[i] == p[j+1]) j++;
            ne[i] = j;
        }
        cout << ne[5] << endl;
        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 - j << " ";
                j = ne[j];
            }
        }
        return 0;
    }
  • 相关阅读:
    走进Android系统
    最后的一像素。
    rem介绍
    软件安装相关问题。
    iscroll
    程序员常用词语发音
    一个程序员眼中的好UI
    myeclipse性能优化
    注入配置数据
    java IO
  • 原文地址:https://www.cnblogs.com/yonezu/p/13606723.html
Copyright © 2011-2022 走看看