#include <bits/stdc++.h>
using namespace std;
const int N = 10010,M = 100010;
char p[N];
char s[M];
int n,m;
int Next[N];
int main(int argc, char** argv)
{
cin>>n>>p+1;
cin>>m>>s+1;
for(int i = 2, j = 0; i <= n; i++)
{
while(j && p[i] != p[j+1])
{
j = Next[j];
}
if(p[i] == p[j+1])
{
j++;
}
Next[i] = j;
}
for(int i = 1, j = 0; i <= M; i++)
{
while(j && s[i] != p[j+1])
{
j = Next[j];
}
if(s[i] == p[j+1])
{
j++;
}
if(j == n)
{
cout<<"匹配成功 ";
cout<<i-n<<endl;
j = Next[j];
}
}
return 0;
}
非改进版本 换种写法 这个易于理解
int * GetNext(string &s)
{
if(1 == s.length())
{
int *p = new int[1];
p[0] = -1;
return p;
}
int *next = new int[s.length()];
next[0] = -1;
next[1] = 0;
int pos = 0;
for(int i = 2; i < s.length(); )
{
if(s[i-1] == s[pos])
{
next[i++] = ++pos;
}
else
{
if(pos > 0)
pos = next[pos];
else
next[i++] = 0;
}
}
return next;
}
int Find(string &a, string &b, int *next)
{
if(a.length() < b.length())
return -1;
int i = 0;
int j = 0;
while(i < a.length() && j < b.length())
{
if(a[i] == b[j])
{
i++; j++;
}
else
{
if(-1 == next[j])
{
i++;
}
else
{
j = next[j];
}
}
}
return b.length() == j ? i - j : -1;
}