1 #include <iostream> 2 #include <string> 3 using namespace std; 4 int Next1[1000000]; 5 char a[1000005],b[1000005]; 6 /* P 为模式串,下标从 0 开始 */ 7 void GetNext(string P,int next1[]){ 8 int p_len=P.size(); 9 int i=0; // P 的下标 10 int j=-1; 11 next1[0]=-1; 12 13 while(i<p_len-1){ 14 if (j == -1 || P[i] == P[j]){ 15 i++; 16 j++; 17 if(P[i]!=P[j])next1[i]=j; 18 else next1[i]=next1[j]; 19 } 20 else 21 j=next1[j]; 22 } 23 } 24 25 /* 在 S 中找到 P 第一次出现的位置 */ 26 int KMP(string S,string P,int Next[]){ 27 GetNext(P, Next); 28 int i=0; // S 的下标 29 int j=0; // P 的下标 30 int s_len=S.size(); 31 int p_len=P.size(); 32 while (i<s_len&&j<p_len){ 33 if (j==-1||S[i]==P[j]){ // P 的第一个字符不匹配或 S[i] == P[j] 34 i++; 35 j++; 36 } 37 else 38 j=Next[j]; // 当前字符匹配失败,进行跳转 39 } 40 41 if (j==p_len) // 匹配成功 42 return i-j; 43 44 return -1; 45 } 46 47 int main(){ 48 int n,ind; 49 50 cin>>a; 51 cin>>b; 52 ind=KMP(a,b,Next1); 53 if(ind!=-1){ 54 cout<<ind<<' '; 55 } 56 else cout<<-1<<' '; 57 return 0; 58 }
之前的有bug,还好多人抄了这篇博客。。。特此致歉