【kmp算法—最小循环节】Cyclic Nacklace HDU

来源:互联网 发布:西电人工智能学院 编辑:程序博客网 时间:2024/05/18 13:42

Think:
1知识点:kmp算法—最小循环节
2题意:输入一个原始字符串,选择在头部或者尾部添加别的字符,使得新的字符串为一个周期循环字符串,询问最小需要添加几个字符
3题意分析:求最小循环节
(1):最小循环节:cir_len = len - next[len-1]
(2):如果cir_len != len && len%cir_len == 0则不需要再添加,除此之外,添加的字符数为cir_len - len%cir_len;

vjudge题目链接
建议参考博客1-参考博主的题意分析
建议参考博客2-参考博主的代码实现

以下为Accepted代码

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int size_P = 100414;int _next[size_P];char st[size_P];void get_next(char *P, int len_P);int main(){    int T, cir_len;    scanf("%d", &T);    while(T--){        scanf("%s", st);        int len_P = strlen(st);        get_next(st, len_P);        cir_len = len_P - _next[len_P-1];/*计算最小循环节长度*/        if(cir_len != len_P && len_P%cir_len == 0) printf("0\n");        else printf("%d\n", cir_len - len_P%cir_len);    }    return 0;}void get_next(char *P, int len_P){    int q, k;    _next[0] = 0;    k = 0;    for(q = 1; q < len_P; q++){        while(k > 0 && P[q] != P[k]){            k = _next[k-1];        }        if(P[q] == P[k])            k++;        _next[q] = k;    }}
原创粉丝点击