本文共 2024 字,大约阅读时间需要 6 分钟。
步骤说明:
next,以找出s的周期性。现在,让我们逐步解释每一步如何实现:
scanf函数逐个读取测试用例,处理每个字符串。通过这种方法,每个测试用例都能够高效地计算出最小的x,满足题目要求。
#includeusing namespace std;void get_next(char *t, int m, int next_) { int i = 1, j = 0; next_[0] = next_[1] = 0; while (i < m) { if (j == 0 || t[i] == t[j]) next_[++i] = ++j; else j = next_[j]; }}int getmin(int n) { int i = 1, j = 2, k = 0; while (i <= n && j <= n && k <= n) { if (c[i] == '0') i++; else if (c[j] == '0') j++; else if (i == j) j++; else if (c[i + k] == c[j + k]) k++; else if (c[i + k] > c[j + k]) i += k + (!k) k = 0; else j += k + (!k) k = 0; } return (i <= n) ? i : j;}int main() { int t; scanf("%d", &t); c[0] = '0'; while (t--) { scanf("%s", c + 1); int l = strlen(c + 1); bool flag = true; for (int i = 1; i <= l; i++) if (c[i] != '0') flag = false; if (flag) { printf("1%s\n", c + 1); continue; } get_next(c, l, next_); int k = next_[l]; while (k && c[l] != c[k]) k = next_[k]; l -= k; for (int i = l + 1; i <= l * 2; i++) c[i] = c[i - l]; int key = getmin(l); c[key + l] = '\0'; printf("%s\n", c + key); } return 0;}
c,并处理每个测试用例。get_next函数计算前缀函数数组next_,用于找出字符串的周期。k,缩减字符串到最大周期的长度。getmin函数用于生成最小的x,确保x的最小重复能够覆盖原字符串。通过该方法,可以高效地处理每个测试用例,找到最小的x,满足题目要求。
转载地址:http://wtlxz.baihongyu.com/