Loading

POJ-1961 字符串, Next数组的应用

给定一个字符串,求字符串的每个循环串的长度和循环节的大小

注意初始化Next

若 i 是 i - Next[i] 的倍数,表面这一段是循环串,循环节的长度是i - Next[i]。这是由于Next数组表示最长公共前后缀,若是倍数关系,表面前面的一段恰好是重复的。

 

char s2[maxn];
int len2;

int Next[maxn];

void get_Next() {
    for (int i = 2, j = 0; i <= len2; i++) {
        while (s2[i] != s2[j + 1] && j > 0) j = Next[j];
        if (s2[i] == s2[j + 1]) Next[i] = ++j;
    }
}


int main() {
    int n;
    int kase = 1;
    while (scanf("%d",&n)) {
        if (!n) break;
        memset(Next, 0, sizeof Next);
        scanf(" %s", s2 + 1);
        printf("Test case #%d\n", kase++);
        len2 = strlen(s2 + 1);
        get_Next();
        for (int i = 1; i <= len2; i++) {
            //printf("%d\n", Next[i]);
            if ((i /(i - Next[i]) > 1) && i % (i - Next[i]) == 0) printf("%d %d\n", i, i / (i - Next[i]));
        }
        puts("");
    }
}

 

posted @ 2020-07-29 14:22  MQFLLY  阅读(149)  评论(0编辑  收藏  举报