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的主要内容,如果未能解决你的问题,请参考以下文章