• KMP算法


    很简单的字符串匹配,KMP以及它的一个简单优化。整理成板子。

     1 #include<bits/stdc++.h> 
     2 #define f(i,a,b) for(int i=a;i<=b;i++)
     3 using namespace std;
     4 char s1[100005];
     5 char s2[100005];
     6 int nxt[100005];
     7 //void getnxt(char s[],int nxt[]){
     8 //    int len=strlen(s);
     9 //    nxt[0]=-1;
    10 //    int i=0,j=-1;
    11 //    while(i<len-1){
    12 //        if(j==-1||s[i]==s[j]){
    13 //            i++,j++;
    14 //            nxt[i]=j;
    15 //        }
    16 //        else j=nxt[j]; 
    17 //    }
    18 //}
    19 void getnxt(char s[],int nxt[]){
    20     int len=strlen(s);
    21     nxt[0]=-1;
    22     int i=0,j=-1;
    23     while(i<len-1){
    24         if(j==-1||s[i]==s[j]){
    25             i++,j++;
    26             if(s[i]==s[j]) nxt[i]=nxt[j];
    27             else nxt[i]=j;
    28         }
    29         else j=nxt[j]; 
    30     }
    31 }
    32 int main(){
    33     while(~scanf("%s",s1)){
    34         if(s1[0]=='#') return 0;
    35         scanf("%s",s2);
    36         getnxt(s2,nxt);
    37         int len1=strlen(s1);
    38         int len2=strlen(s2);
    39         int k=0;
    40         int cnt=0;
    41         int i=0;
    42         while(i<=len1){
    43             while(k<len2&&i<=len1){
    44                 if(k==-1||s1[i]==s2[k]){
    45                     i++,k++;
    46                 }
    47                 else{
    48                     k=nxt[k];
    49                 }
    50             }
    51             if(k==len2){
    52                 cnt++;
    53                 k=0;
    54             }
    55         }
    56         printf("%d
    ",cnt);
    57     }
    58 }

     上面是求有多少个独立子串,下面还有一个输出前缀数组和可不独立子串首次位置的代码。

     1 #include<bits/stdc++.h> 
     2 #define pf printf
     3 #define f(i,a,b) for(int i=a;i<=b;i++)
     4 using namespace std;
     5 char s1[100005];
     6 char s2[100005];
     7 int nxt[100005];
     8 void getnxt(char s[],int nxt[]){
     9     int len=strlen(s);
    10     nxt[0]=-1;
    11     int i=0,j=-1;
    12     while(i<=len-1){
    13         if(j==-1||s[i]==s[j]){
    14             i++,j++;
    15             nxt[i]=j;
    16         }
    17         else j=nxt[j]; 
    18     }
    19 }
    20 //void getnxt(char s[],int nxt[]){
    21 //    int len=strlen(s);
    22 //    nxt[0]=-1;
    23 //    int i=0,j=-1;
    24 //    while(i<len-1){
    25 //        if(j==-1||s[i]==s[j]){
    26 //            i++,j++;
    27 //            if(s[i]==s[j]) nxt[i]=nxt[j];
    28 //            else nxt[i]=j;
    29 //        }
    30 //        else j=nxt[j]; 
    31 //    }
    32 //}
    33 int main(){
    34     while(~scanf("%s",s1)){
    35         scanf("%s",s2);
    36         getnxt(s2,nxt);
    37         int len1=strlen(s1);
    38         int len2=strlen(s2);
    39         int k=0;
    40         int cnt=0;
    41         int i=0;
    42         while(i<=len1){
    43             while(k<len2&&i<=len1){
    44                 if(k==-1||s1[i]==s2[k]){
    45                     i++,k++;
    46                 }
    47                 else{
    48                     k=nxt[k];
    49                 }
    50             }
    51             if(k==len2){
    52                 cnt++;
    53                 k=nxt[len2-1];
    54                 pf("%d
    ",i-len2+1);
    55                 i--;
    56             }
    57         }
    58         printf("%d",nxt[1]);
    59         f(i,2,len2) printf(" %d",nxt[i]);
    60     }
    61 }
  • 相关阅读:
    Java中的匿名对象
    Java决策制定
    「干货总结」程序员必知必会的十大排序算法
    阿里开发手册之ArrayList正确操作方式
    Java中this关键字的使用
    Java封装的概念详解
    【C++】数组的最大子数组
    第二章:分治I
    【C++】归并排序
    第一章:算法绪论
  • 原文地址:https://www.cnblogs.com/St-Lovaer/p/12244223.html
Copyright © 2020-2023  润新知