AcWing 831. KMP字符串

匿名 (未验证) 提交于 2019-12-03 00:17:01

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; }

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!