#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int k;
int nex[100005];
char s[200005];
char b[1005];
int lenb;
inline void kmp1(){
memset(nex,0,sizeof(nex));
nex[0]=0;
for(int i=1,p=0;i<lenb;i++){
while(p>0&&b[p]!=b[i]) p=nex[p-1];
if(b[p]==b[i]) p++;
nex[i]=p;
}
}
int main(){
freopen("kmp.in","r",stdin);
freopen("kmp.out","w",stdout);
scanf("%d",&k);
while(k--){
int n;
scanf("%s",b);
lenb=strlen(b);
kmp1();
scanf("%d",&n);
for(int i=1;i<=n;i++){
memset(s,0,sizeof(s));
scanf("%s",s+1);
bool flag=0;
int lens=strlen(s+1);
for(int j=1,p=0;j<=lens;j++){
while(p>0&&s[j]!=b[p]) p=nex[p-1];
if(s[j]==b[p]) p++;
if(p==lenb){
flag=1;
printf("%d ",j-lenb+1);
}
}
if(!flag){
cout<<0<<" ";
}
cout<<endl;
}
}
return 0;
}
附上一个讲的极明白的网站
http://www.cnblogs.com/c-cloud/p/3224788.html