阿犇

记录生活中的点点滴滴

0%

KMP字符串

Trace

KMP字符串

传送门:https://www.acwing.com/problem/content/833/

Problem

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

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

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

输入格式

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

第二行输入字符串 PP。

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

第四行输入字符串 SS。

输出格式

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

数据范围

1<=N<=1e5

1<=M<=1e6

输入样例:
1
2
3
4
3
aba
5
ababa
输出样例:
1
0 2

暴力:

双指针,两层循环。

程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <bits/stdc++.h>
using namespace std;
int n,m;
string s,p;
int main()
{
cin>>n>>p>>m>>s;
for(int i=0;i<m;i++){
bool flag=true;
for(int j=0;j<n;j++){
if(s[i+j]!=p[j]){
flag=false;
break;
}
}
if(flag) cout<<i<<" ";
}
return 0;
}

KMP

$next[i]=j$

字符串$p$为模板串, $p[1,j]=p[i-j+1]$,前缀与后缀相同且最长。

您的支持是我继续创作的最大动力!