扩展KMP模板

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:26   1495   0
const int N=1e5+10; //文本串长度
const int M=1e5+10; //模式串长度
char a[N]; //文本串
char b[M]; //模式串
int next0[M],extend[N];
void get_next() 
{
    int len=strlen(b);
    next0[0]=len;
    int i=0;
    while(i<len-1&&b[i]==b[i+1]) ++i;
    next0[1]=i;
    i=1;
    for(int k=2;k<len;++k)
 {
        int p=i+next0[i]-1;
        int L=next0[k-i];
        if(k-1+L>=p) 
  {
            int j=(p-k+1)>0?(p-k+1):0;
            while(k+j<len&&b[k+j]==b[j]) ++j;
            next0[k]=j;
            i=k;
        } 
  else next0[k]=L;
    }
}
void get_extend() //extend[i]保存以a[i]为起始的文本串与模式串的最大公共前缀长度 
{
    int i=0,j,po,alen=strlen(a),blen=strlen(b);
    get_next();
    while(a[i]==b[i]&&i<alen&&i<blen) i++;
    extend[0]=i;
    po=0;
    for(i=1;i<alen;i++) 
 {
        if(next0[i-po]+i<extend[po]+po) extend[i]=next0[i-po];
  else 
  {
            j=extend[po]+po-i;
            if(j<0) j=0;
            while(i+j<alen&&j<blen&&a[j+i]==b[j]) j++;
            extend[i]=j;
            po=i;
        }
    }
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP