看了一个晚上扩展KMP模板也没看的太过明白,只是知道可以求哪些字符串题的类型。在扩展KMP模板里面有两个数组next[] 和extend[],next是辅助数组,但也是用来记录一个字符串的后缀串与其本身有公共前缀长度。extend数组则是记录了两个字符串,其中一个字符串的后缀字符串与另外一个字符串有着公共前缀长度。中心思想是这,有时具体问题具体分析。
代码模板:
#include <stdio.h>
#include <string.h>
#define N 500010
int next[N];
int nextval[N];
int extend[N];
char S[N];
char T[N];
void GetNext(char *T)
{
int a=0;
int Tlen=strlen(T);
next[0]=Tlen;
while(a<Tlen-1&&T[a]==T[a+1]) a++;
next[1]=a;
a=1;
for(int k=2;k<Tlen;k++)
{
int p=a+next[a]-1,L=next[k-a];
if((k-1)+L>=p)
{
int j=(p-k+1)>0? p-k+1:0;
while(k+j<Tlen&&T[k+j]==T[j]) j++;
next[k]=j;
a=k;
}
else next[k]=L;
}
}
void GetExtend(char *S,char *T)
{
int a=0;
GetNext(T);
int Slen=strlen(S);
int Tlen=strlen(T);
int MinLen=Slen<Tlen? Slen:Tlen;
while(a<MinLen&&S[a]==T[a]) a++;
extend[0]=a;
a=0;
for(int k=1;k<Slen;k++)
{
int p=a+extend[a]-1,L=next[k-a];
if((k-1)+L>=p)
{
int j=(p-k+1)>0? p-k+1:0;
while(k+j<Slen&&j<Tlen&&S[k+j]==T[j]) j++;
extend[k]=j;
a=k;
}
else extend[k]=L;
}
}