poj 2752 KMPnext[]数组的理解 以及 两种优化

poj 2752 此题易解为:

#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char a[400005]; int next[400005]; int len; void getnext() { int i=0,k=-1; next[0]=-1; while(i<len) { if(k==-1||a[i]==a[k]){ i++; k++; next[i]=k; } else k=next[k]; } } void deal(int n){ if(next[n]>=0) deal(next[n]); if(n>0) printf("%d ",n); } int main() { while(scanf("%s",a)!=EOF) { len=strlen(a); getnext(); deal(len); puts(""); } return 0; }

求next[]数组优化 1:
void getnext(){
    int len=strlen(a);
    nexta[0]=-1;
    int k=-1;
    int j=0;

    while(j<len)
    {
        if(k==-1||a[j]==a[k]){
            ++j;
            ++k;
            if(a[j]!=a[k])
                nexta[j]=k;
            else
                nexta[j]=nexta[k];
        }
        else
            k=nexta[k];
    }
}
 
优化2:
void GetNextval(char *p, int next[]) { int pLen = strlen(p); next[0] = -1; int k = -1; int j = 0; int mLen = pLen - 1; while (j < mLen) { if (p[++j] != p[++k]) { next[j] = k; k = next[k];//把原来外面else的条件直接提到此处,省去一次循环与比较 } else { next[j] = next[k]; } } } 


你可能感兴趣的:(poj 2752 KMPnext[]数组的理解 以及 两种优化)