题意:
给定一个字符串,问最少需要添加几个字符可以使之变为循环序列。
考虑到字符串的最小循环节。
对于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"); } } }