题目链接:https://cn.vjudge.net/problem/HDU-3374
题意:向左移动【0, len-1】次,形成的n个串,求最小和最大串的起始位置,和有多少个
题解:求数目的话,直接找最小循环节即可,最小最大串位置直接最大最小表示法找就可以了。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
char s[N];
int len, nex[N];
void get_nex() {
int i = 0, j = -1;
nex[0] = -1;
while(i < len) {
if(j == -1 || s[i] == s[j])
nex[++i] = ++j;
else
j = nex[j];
}
}
int get_max_min(char *s, int flag) { // 1 最大 0 最小
int len = strlen(s);
int i = 0, j = 1, k = 0, t;
while(i < len && j < len && k < len) {
t = s[(i + k) % len] - s[(j + k) % len];
if(!t) k++;
else {
if(flag) {
if(t > 0) j += k + 1;
else i += k + 1;
} else {
if(t > 0) i += k + 1;
else j += k + 1;
}
if(i == j) j++;
k = 0;
}
}
return min(i, j) + 1;
}
int main() {
int ans;
while(~scanf("%s", s)) {
len = strlen(s);
get_nex();
ans = 1;
if(len % (len - nex[len]) == 0) ans = len / (len - nex[len]);
printf("%d %d %d %d\n", get_max_min(s, 0), ans, get_max_min(s, 1), ans);
}
return 0;
}