UVA 455の定期的な文字列(接頭辞配列)

UVA 455「定期的な文字列」

質問が意図される:文字列Tに、文字列Tのこのセクションの最小サイクル長を出力します

あなたはプレフィックスのn-PIの配列を見つけた場合は、[n]はNで割り切れる、答えはそう答えはNであり、nは-PI [N]です。

上記、赤と青のプレフィックスサフィックス場合と同じ同じ2つの緑色など、文字列全体が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");
    }
}

おすすめ

転載: www.cnblogs.com/albert-biu/p/11298393.html