模板_扩展kmp


  1. int nxt[MAXN],extend[MAXN];  
  2. char S[MAXN],T[MAXN];  
  3. void GetNext(char *T)  
  4. {  
  5.     int a=0;  
  6.     int Tlen=strlen(T);  
  7.     next[0]=Tlen;  
  8.     while(a<Tlen-1&&T[a]==T[a+1]) a++;  
  9.     next[1]=a;  
  10.     a=1;  
  11.     for(int k=2;k<Tlen;k++)  
  12.     {  
  13.         int p=a+next[a]-1,L=next[k-a];  
  14.         if((k-1)+L>=p)  
  15.         {  
  16.             int j=(p-k+1)>0? p-k+1:0;  
  17.             while(k+j<Tlen&&T[k+j]==T[j]) j++;  
  18.             next[k]=j;  
  19.             a=k;  
  20.         }  
  21.         else next[k]=L;  
  22.     }  
  23. }  
  24.   
  25. void GetExtend(char *S,char *T)  
  26. {  
  27.     int a=0;  
  28.     GetNext(T);  
  29.     int Slen=strlen(S);  
  30.     int Tlen=strlen(T);  
  31.     int MinLen=Slen<Tlen? Slen:Tlen;  
  32.     while(a<MinLen&&S[a]==T[a]) a++;  
  33.     extend[0]=a;  
  34.     a=0;  
  35.     for(int k=1;k<Slen;k++)  
  36.     {  
  37.         int p=a+extend[a]-1,L=next[k-a];  
  38.         if((k-1)+L>=p)  
  39.         {  
  40.             int j=(p-k+1)>0? p-k+1:0;  
  41.             while(k+j<Slen&&j<Tlen&&S[k+j]==T[j]) j++;  
  42.             extend[k]=j;  
  43.             a=k;  
  44.         }  
  45.         else extend[k]=L;  
  46.     }  
  47. }

猜你喜欢

转载自blog.csdn.net/c6376315qqso/article/details/77439944
今日推荐