KMP

题目描述

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

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

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

输入格式

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

第二行输入字符串 P。

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

第四行输入字符串 S。

输出格式

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

数据范围

1≤N≤105
1≤M≤106

输入样例:

3
aba
5
ababa

输出样例:

0 2

 

 1 #include <iostream>
 2 using namespace std;
 3 
 4 const int N = 100009;
 5 const int M = 1000009;
 6 
 7 char P[N],S[M];
 8 int n,m;
 9 int ne[N];
10 int main()
11 {
12     cin >> n >> P + 1 >> m >> S + 1;
13     for(int i = 2,j = 0;i <= n;++i)
14     {
15         while(j && P[i] != P[j + 1])
16             j = ne[j];
17         if(P[i] == P[j + 1])
18             j++;
19         ne[i] = j;
20     }
21     
22     for(int i = 1,j = 0;i <= m;++i)
23     {
24         while(j && P[j + 1] != S[i])
25             j = ne[j];
26         if(P[j + 1] == S[i])
27             j++;
28         if(j == n)
29         {
30             cout << i - n << " ";
31             j = ne[j];
32         }
33     }
34     
35     return 0;
36 }

 

上一篇:【算法笔记】KMP和AC自动机


下一篇:KMP