CF1606A AB Balance
题目大意
给定一个字符串,每次可以修改一个字符。
你需要知道将该字符串中 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;
}

浙公网安备 33010602011771号