HDU-3746 Cyclic Nacklace KMP循环节

题意:
给定一个字符串,问最少需要添加几个字符可以使之变为循环序列。

考虑到字符串的最小循环节。

对于len2这个点,若len2 % (len2 - Next[len2]) == 0 则存在最小循环节,长度即len2 - Next[len2]。循环次数 len2 / (len2 - Next[len2])。

因此当满足 len2 % (len2 - Next[len2]) == 0 时且Next[len2] 不为0时,答案就是0,否则len2

若不等于0,那么就是对当前可能的最小循环节补齐。

输出len2 - Next[len2] - len2 % (len2 - Next[len2])。

注意多组数据,初始化Next

char s1[1005], s2[100005];
int Next[100005];
int len1, len2;

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 T;
    T = readint();
    while (T--) {
        memset(Next, 0, sizeof Next);
        scanf("%s", s2 + 1);
        len2 = strlen(s2 + 1);
        get_Next();
        if (len2 % (len2 - Next[len2])) {
            printf("%d
",(len2 - Next[len2] - (len2 % (len2 - Next[len2]))));
        }
        else {
            if (!Next[len2]) printf("%d
", len2);
            else puts("0");
        }
    }
}
原文地址:https://www.cnblogs.com/hznumqf/p/13451131.html