CF1606A AB Balance

洛谷题面

题目大意

给定一个字符串,每次可以修改一个字符。

你需要知道将该字符串中 abba 的个数修改为相等的最少步数。但是只需要输出修改后的字符串。

题目分析

一道还算和谐的题。

容易发现:abba 一定是在一堆 a 和一堆 b 之中的,我们定义 {a} 表示连在一起的许多 a,同理,{b} 表示连在一起的许多 b

序列可以表示为 {a}{b}{a}{b}...,发现:在连续的 ab 之间一定会出现一个 ab,同理,在连续的 ba 之间一定会出现一个 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;
}
上一篇:4.4 数值比较器


下一篇:leetcode 所有子字符串中的元音