UVA 455 Periodic Strings(前缀数组)

UVA 455 "Periodic Strings"

题意:给T个字符串,分别输出这T个字符串的最小循环节长度

求出前缀数组如果n-pi[n]整除n,则答案为n-pi[n],否则为答案为n。

如上图,如果红色的前缀与蓝色的后缀相同,则两段绿色的相同,以此类推,整个字符串可划分为n-pi[n]段相同的子串

#include <bits/stdc++.h>

using namespace std;
const int maxn = 1000;
int pi[maxn];
char a[maxn];

void getnext(int n) {
    pi[1] = 0;
    for (int i = 2, j = 0; i <= n; i++) {
        while (j > 0 && a[i] != a[j + 1]) j = pi[j];
        if (a[i] == a[j + 1]) j++;
        pi[i] = j;
    }
}

int main() {
    int _;
    scanf("%d", &_);
    while (_--) {
        scanf("%s", a + 1);
        int n = strlen(a + 1);
        getnext(n);
        if (n % (n - pi[n]) == 0)
            printf("%d\n", n - pi[n]);
        else
            printf("%d\n", n);
        if (_) printf("\n");
    }
}
posted @ 2019-08-04 15:32  Albert_liu  阅读(209)  评论(0编辑  收藏  举报