模板题:https://www.luogu.org/problem/P3375
学习了kmp算法,虽然不是太懂,贴一个模板先。
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 1000010 using namespace std; char s1[MAXN],s2[MAXN]; int nxt[MAXN],f[MAXN],len1,len2; void CalcNext() { for(int i=2,j=0;i<=len2;i++) { while(j>0&&s2[i]!=s2[j+1]) j=nxt[j]; if(s2[i]==s2[j+1]) j++; nxt[i]=j; } } void Kmp() { for(int i=1,j=0;i<=len1;i++) { while(j>0&&(j==len2||s1[i]!=s2[j+1])) j=nxt[j]; if(s1[i]==s2[j+1]) j++; f[i]=j; //如果f[i]==len2说明s1以第i位结尾的字串和s2成功匹配 } } int main() { scanf("%s %s",s1+1,s2+1); len1=strlen(s1+1); len2=strlen(s2+1); CalcNext(); Kmp(); for(int i=1;i<=len1;i++) if(f[i]==len2) printf("%d ",i-len2+1); for(int i=1;i<=len2;i++) printf("%d ",nxt[i]); printf(" "); return 0; }