KMP 算法 复习 #include <iostream> #include<bits/stdc++.h> using namespace std; char a[2000000],b[2000000]; int Next[2000000]; void get_next(){ Next[0] = 0; int len = strlen(b); int j = 0; for(int i=1;i<len;i++){ j = Next[i-1]; //重点 while(j>0&&b[i]!=b[j])j = Next[j-1]; if(b[i]==b[j])Next[i] = j+1; //重点 else Next[i] = 0; } } int kmp(){ // Next[0] = -1; int len1 = strlen(a); int len2 = strlen(b); int j = 0; for(int i=0;i<len1;i++){ while(j>0&&a[i]!=b[j])j = Next[j-1]; if(a[i]==b[j]){ // i++; //重点 j++; } if(j==len2){ return i-len2+1; } } return -1; } int main() { while(cin>>a){ cin>>b; get_next(); int ans = kmp(); if(ans==-1){ cout<<ans<<endl; } else { cout<<ans+1<<endl; } } return 0; }