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;
}

浙公网安备 33010602011771号