- int nxt[MAXN],extend[MAXN];
- char S[MAXN],T[MAXN];
- 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;
- }
- }
模板_扩展kmp
猜你喜欢
转载自blog.csdn.net/c6376315qqso/article/details/77439944
今日推荐
周排行