Codeforces Round 932 (Div. 2) A Entertainment in MAC

题面

恭喜你,你被硕士援助中心录取了!但是,你在课堂上感到非常无聊,厌倦了无所事事,于是你给自己想了一个游戏。

给你一个字符串 s s s 和一个整数 n n n 。你可以对它进行两种运算:

  1. 将反向字符串 s s s 添加到字符串 s s s 的末尾(例如,如果 $s = $ cpm,那么在执行操作 $s = $ cpmmpc 之后)。
  2. 将当前字符串 s s s 倒转(例如,如果 $s = $ cpm,则在执行操作 $s = $ mpc后)。

需要确定在进行精确 n n n 操作后,可以得到的词序最小的 † ^{\dagger} 字符串。请注意,您可以按照任意顺序进行不同类型的运算,但必须总共进行 n n n 次运算。

† ^{\dagger} 当且仅当以下条件之一成立时,字符串 a a a 在词法上比字符串 b b b 小:

  • a a a b b b 的前缀,但是 a ≠ b a \ne b a=b
  • a a a b b b 不同的第一个位置上,字符串 a a a 的字母在字母表中出现的时间早于 b b b 中的相应字母。

输入

每个测试由多个测试用例组成。第一行包含一个整数 t t t ( 1 ≤ t ≤ 500 1 \leq t \leq 500 1t500 ) - 测试用例的个数。测试用例说明如下。

每个测试用例的第一行包含一个整数 n n n ( 2 ≤ n ≤ 1 0 9 2 \leq n \leq 10^9 2n109 ) - 对字符串 s s s 进行操作的次数。

每个测试用例的第二行包含一个字符串 s s s ( 1 ≤ ∣ s ∣ ≤ 100 1 \leq |s| \leq 100 1s100 )( 1 ≤ ∣ s ∣ ≤ 100 1 \leq |s| \leq 100 1s100 ) - 对字符串 s s s 进行运算的字符串,由小写英文字母组成。
输出

对于每个测试用例,输出一行–在应用 n n n 次操作后可以得到的词典最小字符串。

思路

求输出字典序最小,这就和字符串头尾第一个不同的字符有关系

#include<bits/stdc++.h>
using namespace std;
void run(){
	int n;
	cin>>n;
	string s;
	cin>>s;
	int len = s.length();
	int l = 0,r = len-1;
	while(s[l]==s[r] && l<r)l++,r--;//找到第一对不同的下标
	if(l>=r){
		cout<<s<<endl;//找完了还没找到,意味着是个回文串,转不转都一样
	}else{
		if(s[l] < s[r]){
			if(n%2==0){
				cout<<s<<endl;
			}else{
				cout<<s;
				reverse(s.begin(),s.end());
				cout<<s<<endl;
			}
		}else if(s[l] > s[r]){
			if(n%2==0){
				string ss= s;
				reverse(s.begin(),s.end());
				cout<<s<<ss<<endl;
			}else{
				reverse(s.begin(),s.end());
				cout<<s<<endl;
			}
		}
	}
}
int main(){
	int t;cin>>t;
	while(t--)
		run();
	return 0;
} 
  • 36
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值