20190724 KMP

Posted urchin-c

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20190724 KMP相关的知识,希望对你有一定的参考价值。

  通了个宵,还得去洗衣服,睡醒做题还时很舒服的,发现可能更适合一个人窝在寝室。

  大佬请绕,菜鸡刺猬场

  循环节......len - next[len],  基本我的next数组是从j=-1开始做的,没有系统学过KMP的小白只能总结成,next记录相同前缀的尽可能后面的下标,所以next [ i ] 同时记录了是从 1 开始计算的 第几个元素前缀相同。然后公式就很本能了。

  HDU3746

  题意 给你字符串,然后问在最后加上多少字符,可以使得整个字符串是循环的

  在最后判别加多少个的时候好像有多种判别方式这里提供两种

  

#include <stdio.h>
#include <string.h>
const int maxn = 100000 +10;
char s[maxn];
int next[maxn];
int len, length;
void getnext() 
    int i=0, j = -1;
    next[0] = -1;
    while (i < len) 
        while (j != -1 && s[i] != s[j])
            j = next[j];
        next[++i] = ++j;
    

int main()

    int t;
    scanf("%d", &t);
    while (t--)
        scanf("%s", s);
        len = strlen(s);
        getnext();
        length = len - next[len];
//        printf("length = %d = %d - %d\n", length, len, next[len]);
        if (len % length == 0 && len != length) 
            puts("0");
        else 
            //1
            printf("%d\n", (length - len % length) == 0 ? (len) : (length - len % length));
            //2 printf("%d\n", length - next[len] % length);//next可以确定最后一个元素在上一个周期里
            //面的哪个位置,然后去掉前面的周期
        
    
    return 0;

 

以上是关于20190724 KMP的主要内容,如果未能解决你的问题,请参考以下文章

kmp算法啥意思?

扩展kmp

kmp算法详解

hdu-4763(kmp+拓展kmp)

KMP&拓展KMP

什么是KMP算法?KMP算法推导