传送门
http://codeforces.com/contest/1316/problem/B
题意
反转一个字符串,反转规则为从字符串首字母开头,长度为k(1<=k<=n),反转问一个k时会得到一个新串,求字典序最小的新串和k,如果字典序相同,则返回最小的k。
思路
纯暴力肯定tle,昨晚一直找规律,刚开始想的每次左移一个字符,后来发现不行。最后借鉴了一下大神的代码,原来是字符串拼接+反转。每次将字符串按照这样拼接(k-1,len-(k-1))+(0,k-1),然后遇到n-(k-1)为奇数是,就会发现最开始的k-1个字符反转到最后的时候是回不到原序的,只能保留被反转的状态。
代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string s;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,res=1;
cin>>n>>s;
string ans=s;
for(int k=2;k<=n;k++)
{
string t=s.substr(k-1,n-(k-1));//从0开始,所以为k-1
string r=s.substr(0,k-1);
if((n-(k-1))%2) reverse(r.begin(),r.end());//满足条件反转
t+=r;
if(t<ans)//找更优值
{
ans=t;
res=k;
}
}
cout<<ans<<endl;
cout<<res<<endl;
}
return 0;
}