题目链接: Diane
大致题意
给定一个 n n n, 表示要构造出的字符串长度.
所构造出的字符串 s s s应满足: ① ∣ s ∣ = n |s| = n ∣s∣=n ② s s s由小写字母组成 ③ s s s中任意连续子序列应在串中出现奇数次.
解题思路
思维
一般考虑到用小写字母构造字符串的题目, 我们应考虑到用尽可能少的字母来完成题目要求.
对于本题: 如果某个字符出现仅一次, 则一定满足要求. 反之(以字母a为例), aa, aaaa这样的子串, 奇数长度的段会出现偶数次, 不符合题意. 而aaa, aaaaa这样的子串, 偶数长度的段会出现偶数次, 也不符合题意.
因此我们应产生这样的一个想法, 对于某个字符而言, 如果存在一个奇数子串 s 1 s1 s1, 又存在一个偶数子串 s 2 s2 s2, 且两者长度相差等于1, 则我们可以保证字符串满足题意.
因此我们不妨进行分类讨论:
①如果n为奇数: 则我们可以构造aaaa bc aaaaa的形式, 前面有 n 2 − 1 \frac{n}{2} - 1 2n−1个’a’, 中间放"bc", 最后有 n 2 \frac{n}{2} 2n个’a’.
②如果n为偶数, 我们可以构造aaaa b aaaaa的形式, 前面有 n 2 − 1 \frac{n}{2} - 1 2n−1个’a’, 中间放"bc", 最后有 n 2 \frac{n}{2} 2n个’a’.
特别的, 如果 n ≤ 3 n \le 3 n≤3, 我们可以进行特判, 来避免左右侧不存在’a’的情况.
AC代码
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
using namespace std;
typedef long long ll;
int main()
{
int t; cin >> t;
while (t--) {
int n; scanf("%d", &n);
if (n <= 3) {
string s;
rep(i, n) s += i + 'a' - 1;
puts(s.c_str());
continue;
}
int a = n / 2;
string s(a - 1, 'a');
s += n & 1 ? "bc" : "b";
string qaq(a, 'a');
s += qaq;
puts(s.c_str());
}
return 0;
}