码迷,mamicode.com
首页 > Windows程序 > 详细

AcWing 831. KMP字符串

时间:2019-11-04 10:01:33      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:ble   ios   匹配   next   ++   不能   print   nbsp   ext   

https://www.acwing.com/problem/content/833/

#include <iostream>
using namespace std;
const int N = 10010, M = 100010;
int n, m;
int ne[N];
char s[M], p[N];
int main() {
    cin >> n >> p + 1 >> m >> s + 1;
    //求next过程
    //i从2开始,因为next[1]=0,如果第一个字母失败了,只能从0开始
    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;
    }
    //kmp匹配过程
    for (int i = 1, j = 0; i <= m; i ++ ) {
        while (j && s[i] != p[j + 1])    //当j没有退回起点,并且当前的s[i]不能和下一个j的位置匹配
            j = ne[j];//移动,保证之前的相等  直到匹配位置,或者j已经到开头了
        if (s[i] == p[j + 1]) //如果已经匹配了
            j ++ ;  //j往下移动
        if (j == n) {//说明匹配成果
            printf("%d ", i - n+1);
            j = ne[j];
        }
    }
    return 0;
}

 

AcWing 831. KMP字符串

标签:ble   ios   匹配   next   ++   不能   print   nbsp   ext   

原文地址:https://www.cnblogs.com/QingyuYYYYY/p/11790107.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!