码迷,mamicode.com
首页 > 其他好文 > 详细

20190724 KMP

时间:2019-07-24 13:08:08      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:--   hdu   下标   一个   字符串   strlen   next   clu   amp   

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

  大佬请绕,菜鸡刺猬场

  循环节......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

标签:--   hdu   下标   一个   字符串   strlen   next   clu   amp   

原文地址:https://www.cnblogs.com/Urchin-C/p/11237260.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!