CF1616B Mirror in the String - 1100

传送门

题目思路

最初我的思路是从头开始遍历,如果不能满足 \(s_i < s_{i-1}\) 则终止,否则将 \(s_i\) 加入答案 \(t\)。由于我只考虑到形如 aaaa 的字符串最后答案是 aa,于是我愉快地提交并且失败了。

错误写法:

for(int i=1;i<n;i++){
  	if(s[i]>=s[i-1])	break;
    t+=s[i];
}

一个样例:

3
baa

显然 baaaab 优于 baab

那怎么处理?

由于 \(t\) 一定是一个不升的串,所以当 \(s_i=t_0\) 时,那么继续加 \(s_i\) 会使结果字符串变长,答案变劣,所以要终止循环。

当然,\(s_i > s_{i-1}\) 也要终止循环。这是显而易见的。

AC Code

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n;
string s;
void solve(){
	cin>>n>>s;
	string t,ans;
	t+=s[0];
	for(int i=1;i<n;i++){
		if(s[i]>s[i-1]||s[i]==t[0])	break;
		t+=s[i];
	}
	ans=t;
	reverse(t.begin(),t.end());
	ans+=t;
	cout<<ans<<"\n";	
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0);
	int T;cin>>T;
	while(T--)	solve();
	return 0;
}
posted @ 2026-05-31 15:49  深申  阅读(13)  评论(0)    收藏  举报