打算学AC自动机,才发现博客里没有写KMP的板子,补一发。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define foru(i,x,y) for(int i=x;i<=y;i++) 5 using namespace std; 6 7 int nxt[1000010],lb,la; 8 char sa[1000010],sb[1030]; 9 //nxt[i]:模式串的前i位中,最长公共前后缀的长度 10 //注意,前缀不含s[len],后缀不含s[0] 11 void getnxt(){ 12 for(int k=0,i=1;i<lb;i++){ 13 while(k>0&&sb[i]!=sb[k]) 14 k=nxt[k-1];//最长公共前后缀失配,向前寻找 15 if(sb[i]==sb[k])k++; 16 nxt[i]=k; 17 } 18 } 19 20 void kmp(){ 21 for(int i=0,j=0;i<la&&j<lb;i++){ 22 while(j>0&&sa[i]!=sb[j])j=nxt[j-1];//失配时直接移动到前一位的nxt[]位置 23 if(sa[i]==sb[j])j++; 24 if(j==lb){printf("%d %d ",i-lb+2,i+1);return;} 25 } 26 printf("NO "); 27 } 28 29 int main(){ 30 scanf("%s%s",sa,sb);//sa为母串 sb为模式串 31 la=strlen(sa);lb=strlen(sb); 32 getnxt(); 33 kmp(); 34 return 0; 35 }