CF708A Letters Cyclic Shift 题解
题目链接:CF708A Letters Cyclic Shift
题意:一次变换指将字母变为它前面一个字母,例如
a
变成z
,b
变成a
,给定字符串,找出一个非空子串进行变换使得改变后字典序尽可能小
要求字典序最小,首先想到从最左端开始改变
那么这样做一定是最小的吗?例如下面这种
aabcdefabb
如果改变了第一个字符a
,它会变成z
,字典序不降反升
我们可以初步得到结论,从第一个不为a
的位置开始改变,能得到最小结果
再看题目,要求改变的是非空子串,因此只能改变到下一个不为a
的位置
因此aabcdefabb
改变后变为aaabcdeabb
还有一种情况要特判 例如aaaaa
题目要求你必须选择一个非空子串,这种情况只要把最后一个字符改变就行了
代码如下
#include<bits/stdc++.h>
using namespace std;
#define R register
string s;
bool flag;
signed main()
{
cin>>s;
for(R int i=0; i<s.size(); i++)
if(s[i]^97) //s[i]!='a'
{
s[i]--;flag=1;
}
else if(flag) return cout<<s,0;
if(!flag)s[s.size()-1]='z';//特判
cout<<s;
return 0;
}