• KMP模板


    打算学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 }
  • 相关阅读:
    vim
    echo
    kill/xkill/killall/pkill/pidof
    ssh
    使用GSON
    使用GSON
    解析JSON
    解析JSON
    Pull解析方式
    Pull解析方式
  • 原文地址:https://www.cnblogs.com/y-m-y/p/7253054.html
Copyright © 2020-2023  润新知