B. String Modification
题意
给定一个字符串长度为n,每次你可以选择一个长度不大于n的k,对字符串从头到尾每隔k个字符翻转,求出翻转的最小字典序以及此时的k。
思路
模拟+找规律。
在几遍演算之后可以发现,某一k值下的翻转,都是分成两部分序列,后面的序列移到前面,前面的序列移到后面;
但是后面的序列又有规律,
当(n-i)为奇数的时候,是原序列,
当为偶数的时候,就是将后移的序列翻装一遍
代码实现
#include<bits/stdc++.h> using namespace std; typedef long long LL; int main() { int T; cin>>T; while(T--) { int n; cin>>n; string a; cin>>a; string ans,s1,s; ans=a; int k=1; for(int i=1;i<=n;i++) { s1="",s=""; s1=a.substr(0,i-1); if((n-i)%2==0)reverse(s1.begin(),s1.end()),s=a.substr(i-1,n-i+1)+s1; else s=a.substr(i-1,n-i+1)+s1; if(s<ans)ans=s,k=i; } cout<<ans<<endl; cout<<k<<endl; } return 0; }