首页 > 代码库 > kmp模版

kmp模版

 1 int kmpnext[N]; 2 char s[N],t[N];///s为主串,t为模式串 3 int slen,tlen;///slen为主串的长度,tlen为模式串的长度 4 void getnext() 5 { 6     int i,j; 7     j=next[0]=-1; 8     i=0; 9     while(i<tlen)10     {11         if(j==-1||x[i]==x[j])12         {13             kmpnext[++i]=++j;14         }15         else16         {17             j=kmpnext[j];18         }19     }20 }21 /*22 返回模式串T在主串S中首次出现的位置23 返回的位置是从0开始的。24 */25 int kmp_index()26 {27     int i=0,j=0;28     getnext();29     while(i<slen&&j<tlen)30     {31         if(j==-1||s[i]==t[j])32         {33             i++;34             j++;35         }36         else37             j=kmpnext[j];38     }39     if(j==tlen)40         return i-tlen;41     else42         return -1;43 }44 /*45 返回模式串在主串S中出现的次数46 */47 int kmp_count()48 {49     int ans=0;50     int i,j=0;51     if(slen==1&&tlen==1)52     {53         if(s[0]==t[0])54             return 1;55         else56             return 0;57     }58     getnext();59     for(i=0;i<slen;i++)60     {61         while(j>0&&s[i]!=t[j])62             j=kmpnext[j];63         if(s[i]==t[j])64             j++;65         if(j==tlen)66         {67             ans++;68             j=kmpnext[j];69         }70     }71     return ans;72 }

 

kmp模版