Codeforces1554D Diane (构造)

题目链接: 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 2n1个’a’, 中间放"bc", 最后有 n 2 \frac{n}{2} 2n个’a’.

②如果n为偶数, 我们可以构造aaaa b aaaaa的形式, 前面有 n 2 − 1 \frac{n}{2} - 1 2n1个’a’, 中间放"bc", 最后有 n 2 \frac{n}{2} 2n个’a’.


特别的, 如果 n ≤ 3 n \le 3 n3, 我们可以进行特判, 来避免左右侧不存在’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;
}

END

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥Fau

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值