KMP模板題
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include<algorithm>
#include<stdio.h>
#define N 10000+5
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
int n, m;
int nex[1000005];
char s1[1000005], s2[1000005];
void getnex()
{
nex[0] = { -1 };
int k = -1;
int j = 0;
while (j < m)
{
if (k == -1 || s2[j] == s2[k])
{
++k;
++j;
nex[j] = k;
}
else
{
k = nex[k];
}
}
}
void kmp()
{
int i = 0, j = 0;
int ans = 0;
while (i < n)
{
if (j == -1 || s1[i] == s2[j])
{
i++;
j++;
if (j == m)
{
printf("%d ",i - m);
}
}
else
{
j = nex[j];
}
}
}
int main()
{
int T;
memset(nex, -1, sizeof(nex));
scanf("%d",&m);
scanf("%s", s2);
scanf("%d",&n);
scanf("%s", s1);
getnex();
kmp();
return 0;
}