题意:
反转一个字符串,反转规则为从字符串首字母开头,长度为 ,反转问一个 $k $时会得到一个新串,求字典序最小的新串和 ,如果字典序相同,则输出最小的 。
比赛时被卡, 疯狂 ,其实举个栗子就能发现翻转的规律。
比如
- 翻转长度为 时最后结果是
- 翻转长度为 时最后结果是
- 翻转长度为 时,就是把后面
- 当翻转长度为奇数时,把前
- 当翻转长度为偶数时,把前 的字符串倒置后放到后面。
找到这个规律就很简单了,暴力枚举所有翻转长度求最小即可。
AC代码:
const int N = 10010;
int n, m;
int res, ans, tmp;
int x, y;
string s, a, b, c;
int main()
{
int t;
cin >> t;
while (t--)
{
sd(n);
cin >> s;
a = s;
ans = 1;
rep(i, 1, n - 1)
{
b = s.substr(i); //从start位开始,取str之后的字符串
c = s.substr(0, i); //从a位开始,取b位字符串
if ((n - i - 1) % 2 == 0)
reverse(c.begin(), c.end());
b += c;
if (b < a)
{
a = b;
ans = i + 1;
}
}
cout << a << endl;
cout << ans << endl;
}
return 0;
}