poj 1961 2406 让你彻底理解KMP的next[]数组的两个题目

两题运用kmp思路基本上是一样的,都是从头开始找相同前缀的  

运用next数组原理,让你充分理解,即使不理解,你也记住了,哈哈

poj 2406

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

const int MAX_=1000005;
char a[MAX_];
int next[MAX_];
int len;

void getnext()
{
    int i=0;
    int k=-1;
    next[0]=-1;
    while(i<len){
        if(k==-1||a[i]==a[k]){
            i++;k++;
            next[i]=k;
        }
        else
            k=next[k];
    }
}

int main()
{
    while(scanf("%s",a),strcmp(a,"."))
    {
        len=strlen(a);
        getnext();

        if(len%(len-next[len])==0)
            printf("%d\n",len/(len-next[len]));
        else
            printf("1\n");
    }
    return 0;
}
poj1961
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

const int MAX_=1000005;
char a[MAX_];
int next[MAX_];
int len;

void getnext()
{
    int i=0;
    int k=-1;
    next[0]=-1;

    while(i<len){
        if(k==-1||a[i]==a[k]){
            i++;
            k++;
            next[i]=k;
        }
        else
            k=next[k];
    }
}

int main()
{
    int n;
    int count=0;
    while(scanf("%d",&len),len)
    {
        scanf("%s",a);
        printf("Test case #%d\n",++count);

        getnext();

        for(int i=2;i<=len;i++)
        if(i%(i-next[i])==0&&i/(i-next[i])!=1)
            printf("%d %d\n",i,i/(i-next[i]));
        puts("");
    }
    return 0;
}

你可能感兴趣的:(poj 1961 2406 让你彻底理解KMP的next[]数组的两个题目)