Example Input
4 10 codeforces 9 cbacbacba 3 aaa 4 bbaa
Output
cc cbaabc aa bb
你有一字符串s,你站在字符串的左边,向右看。您想选择一个索引k (1≤K≤n) 在第k个字母后面放一面镜子,这样你看到的是s1s2…sksk−1…s1 .找出能看到的最小词典字符串
对于每个测试用例,打印您所能看到的按字典顺序排列的最小字符串。
一个没用的小知识
如果使用 #define int long long 时不能使用 int main()
因为main 函数必须返回一个 int 值,所以不能使用 int main(),通常使用 signed main,因为 signed 等效替代于 signed int,也就是有符号整型,这与 int 别无二致,并且不会导致奇怪的 CE。
当你不确定过程中会不会爆 int 的时候,可以这么写。
#include <iostream>
using namespace std;
const int N = 1e5 + 1;
int a[N];
string s;
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n >> s;
for (int i = 1; i <= n; i++)
a[i] = (s[i - 1] - 'a');//非常巧妙,a的下标是从1到n,s是从0到n-1
if (n == 1 || a[1] == a[2]) {//当只有一个字符或前两个相等时
cout << s[0] << s[0] << endl;
} else {
int e;
for (int i = 2; i <= n; i++) {
if (a[i] > a[i - 1]) {//找到第一个i-1位置等于
e = i - 1;
break;
}
if (i == n)//最差情况,全部输出
e = i;
}
for (int i = 1; i <= e; i++)//先正序输出再倒序输出,如果用cout应该强制转换
cout << ((char) (a[i] + 'a')); //printf("%c", a[i] + 'a');
for (int i = e; i >= 1; i--)
cout << ((char) (a[i] + 'a')); //printf("%c", a[i] + 'a');
cout << endl;
}
}
return 0;
}