首页 > 学院 > 开发设计 > 正文

kmp模板

2019-11-08 01:40:04
字体:
来源:转载
供稿:网友

#include<stdio.h>int a[1000010],b[10010];// a是目标字符串,b是匹配字符串int next[10010]; // 当匹配串a失配的时候,next数组对应的元素指导应该用a串的哪个元素进行下一轮的匹配int n,m;// n是目标串的长度, m是匹配串长度。void getNext(){    int j,k;    j=0;    k=-1;    next[0]=-1;    while(j<m)    {         if(k==-1||b[j]==b[k])        {            j++;            k++;            if(b[j] != b[k])// 解决特殊情况例如匹配串为ccccccccd            {                next[j] = k;            }            else                next[j] = next[k];        }        else k=next[k];    }}//返回首次出现的位置int KMP_Index(){    int i=0,j=0;    getNext();    while(i<n && j<m)    {        if(j==-1||a[i]==b[j])        {            i++;            j++;        }        else j=next[j];    }    if(j==m) return i-m+1;    else return -1;}int KMP_count()  //包含子串个数{    int ans=0;    int i,j=0;    if(wlen==1&&tlen==1)    {        if(W[0]==T[0])return 1;        else return 0;    }    getNext();    for(i=0;i<tlen;i++)    {        while(j>0&&T[i]!=W[j])          j=next[j];        if(W[j]==T[i])j++;        if(j==wlen)        {            ans++;            j=next[j];        }    }    return ans;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表