kmp算法
个人认为只要理解了大概,其实里面的细节只需要记忆即可,
包括很多时候,舍本逐末是一种低效且容易给自己带来自我满足感的错误活动(以为自己在钻研)
时刻要提醒自己做正确的事,或者是经过思考的事
#include<iostream>
using namespace std;
const int N = 100010 , M = 1000010;
char s[N] , q[M] ;
int ne[N];
int n,m;
int main()
{
cin>>m>>s+1>>n>>q+1;
for(int i = 2,j = 0;i <= m;i++)
{
while(j && s[i] != s[j+1]) j = ne[j];
if(s[i] == s[j+1])j++;
ne[i] = j;
}
for(int i = 1,j = 0;i <= n;i++)
{
while(j && q[i] != s[j+1]) j = ne[j];
if(q[i] == s[j+1])j++;
if(j == m)
{
printf("%d ",i-m);
j = ne[j];
}
}
return 0;
}