HDU - 1358 Period(KMP next数组)

来源:互联网 发布:软件总体设计方案 编辑:程序博客网 时间:2024/05/20 18:44

题目大意:给你一个字符串,要求你找出所有的循环部分。找出循环部分指的是前i个字符都是由循环节构成,且至少要由两个循环节构成,并输出循环节出现的次数

解题思路:next数组和循环节的概念了,理解了就会了

#include <cstdio>#include <cstring>const int N = 1000010;int len;char str[N];int next[N];void getFail() {    next[0] = -1;    int i = 0, j = -1;    while (i < len) {        if (j == -1 || str[j] == str[i]) {            i++; j++;            next[i] = j;        }        else j = next[j];    }}void solve() {    for (int i = 2; i <= len; i++) {        int t = i - next[i];        if (t != i && i % t == 0) printf("%d %d\n", i, i / t);    }}int main() {    int cas = 1;    while (scanf("%d", &len) != EOF && len) {        printf("Test case #%d\n", cas++);        scanf("%s", str);        getFail();        solve();        printf("\n");    }    return 0;}
0 0