一、题目描述
二、算法分析说明与代码编写指导
三、AC 代码
法一(468 ms):
#include<cstdio>
#include<algorithm>
#include<cstring>
#pragma warning(disable:4996)
using namespace std;
template<class _Ty> inline size_t minexp(const _Ty* const a, const size_t& n) {
size_t k = 0, i = 0, j = 1;
while (k < n && i < n && j < n) {
if (a[(i + k) % n] == a[(j + k) % n])++k;
else {
a[(i + k) % n] > a[(j + k) % n] ? i = i + k + 1 : j = j + k + 1;
k = 0; if (i == j)++i;
}
}
return min(i, j);
}
template<class _Ty> inline size_t maxexp(const _Ty* const a, const size_t& n) {
size_t k = 0, i = 0, j = 1;
while (k < n && i < n && j < n) {
if (a[(i + k) % n] == a[(j + k) % n])++k;
else {
a[(i + k) % n] < a[(j + k) % n] ? i = i + k + 1 : j = j + k + 1;
k = 0; if (i == j)++i;
}
}
return min(i, j);
}
template<class _Nty> inline unsigned getnext(const char* const p, _Nty* const Next, const _Nty& lp) {
_Nty i = 1, j = 0; Next[1] = 0;
while (i <= lp) {
if (j == 0 || p[i] == p[j]) { ++i, ++j, Next[i] = j; }
else j = Next[j];
}
return lp % (lp - Next[lp + 1] + 1) ? 1 : lp / (lp - Next[lp + 1] + 1);
}//The index of the head of p string is 1.
unsigned l, n, Next[1000002], m, M; char s[1000003];
int main() {
for (;;) {
fgets(s + 1, 1000002, stdin); if (feof(stdin))return 0;
l = strlen(s + 1) - 1; n = getnext(s, Next, l); m = minexp(s + 1, l) + 1; M = maxexp(s + 1, l) + 1;
printf("%u %u %u %u\n", m, n, M, n);
}
}
法二(109 ms):
#include<cstdio>
#include<algorithm>
#include<cstring>
#pragma warning(disable:4996)
using namespace std;
template<class _Nty> inline unsigned getnext(const char* const p, _Nty* const Next, const _Nty& lp) {
_Nty i = 1, j = 0; Next[1] = 0;
while (i <= lp) {
if (j == 0 || p[i] == p[j]) { ++i, ++j, Next[i] = j; }
else j = Next[j];
}
return lp % (lp - Next[lp + 1] + 1) ? 1 : lp / (lp - Next[lp + 1] + 1);
}//The index of the head of p string is 1.
template<class _Ty> inline size_t minexp(const _Ty* const a, const size_t& n) {
size_t k = 0, i = 0, j = 1, p, q;
while (k < n && i < n && j < n) {
p = i + k >= n ? i + k - n : i + k; q = j + k >= n ? j + k - n : j + k;
if (a[p] == a[q])++k;
else {
a[p] > a[q] ? i += k + 1 : j += k + 1;
k = 0; if (i == j)++i;
}
}
return min(i, j);
}
template<class _Ty> inline size_t maxexp(const _Ty* const a, const size_t& n) {
size_t k = 0, i = 0, j = 1, p, q;
while (k < n&& i < n&& j < n) {
p = i + k >= n ? i + k - n : i + k; q = j + k >= n ? j + k - n : j + k;
if (a[p] == a[q])++k;
else {
a[p] < a[q] ? i += k + 1 : j += k + 1;
k = 0; if (i == j)++i;
}
}
return min(i, j);
}
unsigned l, n, Next[1000002], m, M; char s[1000003];
int main() {
for (;;) {
fgets(s + 1, 1000002, stdin); if (feof(stdin))return 0;
l = strlen(s + 1) - 1; n = getnext(s, Next, l); m = minexp(s + 1, l) + 1; M = maxexp(s + 1, l) + 1;
printf("%u %u %u %u\n", m, n, M, n);
}
}