B. String Modification

B. String Modification

  1. 题意

    给定一个字符串长度为n,每次你可以选择一个长度不大于n的k,对字符串从头到尾每隔k个字符翻转,求出翻转的最小字典序以及此时的k。

  2. 思路

    模拟+找规律。

    在几遍演算之后可以发现,某一k值下的翻转,都是分成两部分序列,后面的序列移到前面,前面的序列移到后面;

    但是后面的序列又有规律,

    当(n-i)为奇数的时候,是原序列,

    当为偶数的时候,就是将后移的序列翻装一遍

  3. 代码实现

    #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;
    }

猜你喜欢

转载自www.cnblogs.com/AC-AC/p/12427060.html