对s串生成一个哈希值,然后前缀哈希法生成p串的哈希,然后枚举长度为s串长度的p串子串哈希值,遇到相同的就输出下标,时间复杂度O(n)
#include <iostream>
#include <cstring>
#include <algorithm>
#define int long long
using namespace std;
const int N = 1e5 + 10;
const int M = 3100010;
const int X = 13331;
const int mod = 19660813;
int son[N][2], idx;
int p2[N],h[N];
int a[N];
int get(int l,int r)
{
return (h[r]-h[l-1]*p2[r-l+1]%mod+mod)%mod;
}
signed main()
{
int n, m;
string s, p;
cin >> n >> s;
cin >> m >> p;
int h1 = 0, p1 = 1;
s="#"+s;p="#"+p;
for (int i = 1; i <= n; i++)
{
h1 = (h1 * X + s[i]) % mod;
}
p2[0]=1;
for(int i=1;i<=m;i++)
{
h[i]=(h[i-1]*X+p[i])%mod;
p2[i]=(p2[i-1]*X)%mod;
}
for(int i=1;i+n-1<=m;i++)
{
if(get(i,i+n-1)==h1)
{
cout<<i-1<<" ";
}
}
return 0;
}