北大oj题解:2406

考察对KMP算法中next数组的理解:
1> 对于未改良的next数组,next[j]=k表示的是在串str中str[j]之前str[0…k-1]=str[j-k…j-1],但是在寻找相等的字符数目时,不包括第一个字符,即对于aaaa,next[3]=2,k代表的是若当前字符不匹配,则应从str[k]开始下一次检查。
对于本题,若所给字符串下标为0…len-1,则求next[len]可得该字符串中最长相等的子串的长度,若有最小循环单元,则len-n为此单元长度,且len%(len-n)==0,若无最小循环单元,则有两种情况,一种是找不到任何循环单元,如aaab,返回值为0,此时也可以整除,不过结果为1,另外一种可以找到,如aabaa,返回2,无法整除。
2> 对于改良的next数组,在求解数组时考虑到了str[k]与str[j]是否相等。如果相等,则next[j]=next[k]

#include <stdlib.h>
#include <stdio.h>
#include <cstring>
#include <iostream>
using namespace std;

void get_next(char str[],int next[],int len) {
    next[0]=-1;
    int k=-1,j=0;
    while(j<len) {
        if(k==-1||str[k]==str[j]){
            k++;j++;
            next[j]=k;
        }
        else k=next[k];
    }
}

int main() {
    char str[1000000];
    scanf("%s",str);
    while(str[0]!='.') {
        int len=strlen(str);
        int next[len+1];
        for(int i=0;i<=len;i++)
            next[i]=0;
        get_next(str,next,len);
        int n=next[len];
        if(n!=0&&len%(len-n)==0)
            printf("%d",len/(len-n));
        else
            printf("1");
        printf("\n");
        scanf("%s",str);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值