题目大意
给定一个字符串,每次可以修改一个字符。
你需要知道将该字符串中 ab
和 ba
的个数修改为相等的最少步数。但是只需要输出修改后的字符串。
题目分析
一道还算和谐的题。
容易发现:ab
和 ba
一定是在一堆 a
和一堆 b
之中的,我们定义 {a}
表示连在一起的许多 a
,同理,{b}
表示连在一起的许多 b
。
序列可以表示为 {a}{b}{a}{b}...
,发现:在连续的 a
和 b
之间一定会出现一个 ab
,同理,在连续的 b
和 a
之间一定会出现一个 ba
。
所以 \(\rm AB(s)\) 和 \(\rm BA(s)\) 最多相差 \(1\)。
考虑 \(\rm AB(s)=BA(s)+1\):
-
最后的元素为
b
时,我们把b
改成a
,于是相等。破坏了一个ab
。 -
最后的元素为
{b}
时,我们把最后面的b
改成a
,于是相等。增加了一个ba
。
考虑 \(\rm AB(s)+1=BA(s)\):
-
最后的元素为
a
时,我们把a
改成b
,于是相等。破坏了一个ab
。 -
最后的元素为
{a}
时,我们把最后面的a
改成b
,于是相等。增加了一个ab
。
总而言之,其实不管怎样,我们只需要将字符串最后面的字符改成第一个字符即可。
代码
int main(void)
{
ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--)
{
string str;
cin>>str;
str[str.size()-1]=str[0];//str.back()=str[0];
cout<<str<<endl;
}
return 0;
}