kmp
#include<cstdio> #include<string.h> using namespace std; const int maxn=1e6+10; char S[maxn]; char T[maxn]; int ls,lt; int Next[maxn];//next[i] i始终指的是匹配上的一串后面那一个 //next[i] 为T0~Ti-1 共i个字符,即为匹配长度 void kmp(int pos) { Next[0]=-1; int j=0,k=-1; while(j<lt) { if(k==-1||T[k]==T[j]) { k++;j++; Next[j]=k; } else k=Next[k]; } int i=pos; j=0; while(i<ls&&j<lt) { if(S[i]==T[j]||j==-1)//j==-1:next[0] 向前回退到了T0 此时没有前后缀 {i++;j++;} else j=Next[j]; if(j==lt) { printf("%d\n",i-lt);//输出下标 j=Next[j]; } } } int main() { scanf("%s",S); scanf("%s",T); ls=strlen(S); lt=strlen(T); kmp(0); for(int i=1;i<=lt;i++) printf("%d ",Next[i]); return 0; }
只把这个下标从零开始的记熟
浙公网安备 33010602011771号