zoukankan      html  css  js  c++  java
  • 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 - pi[n]);
            else
                printf("%d
    ", n);
            if (_) printf("
    ");
        }
    }
    
  • 相关阅读:
    POJ
    HDU
    POJ
    HDU
    HDU
    HDU
    POJ
    ZOJ
    ZOJ
    Kattis
  • 原文地址:https://www.cnblogs.com/albert-biu/p/11298393.html
Copyright © 2011-2022 走看看