很显然,这是一道智商题(bushi)
题目链接放着了哦
在我的博客食用更佳
晚上实在没空打 CF,第二天早上补题目,看到 D 题的样例输出瞬间懵了,但是感觉不是这样的。
后来想了半天看了 tags,上面写着 greedy (贪心)。我才想到,只用
a
b
c
abc
abc 三个字母,搞贪心的话也可以实现。
题目(已翻译)
给你一个整数 n n n。找出任何长度为 n n n 的字符串 s s s,只包含英文小写字母,使 s s s 的每个非空子字符串以 s s s 的奇数次数出现。
如果字符串 a a a 是字符串 b b b 的子字符串,那么 a a a 可以从 b b b 中获得,方法是从开头删除几个(可能是零个或全部)字符,从结尾删除几个(可能是零个或全部)字符。
输入
第一行包含一个整数
t
t
t。
接下来
t
t
t 行,每行是一个整数
n
n
n。
输出
对于每个测试用例,打印一行包含字符串
s
s
s 的代码。
如果有多个这样的字符串,输出任何一个。以此可以证明这样的字符串在给定的约束条件下始终存在。
样例输入
4
3
5
9
19
样例输出
abc
diane
bbcaabbba
youarethecutestuwuu
数据约定
1
⩽
t
⩽
500
1\leqslant t\leqslant 500
1⩽t⩽500,
1
⩽
n
⩽
1
0
5
1\leqslant n\leqslant 10^5
1⩽n⩽105 。
保证总和
n
n
n 在所有测试用例中不超过
3
⋅
1
0
5
3 \cdot 10^5
3⋅105 。
总之,这道题的基本想法就是,左边放
1
2
⋅
n
\displaystyle\frac{1}{2}\cdot n
21⋅n (向下取整)个
a
a
a。
如果是偶数个,那中间放个
b
b
b,奇数个就放
b
c
bc
bc。
然后再放
1
2
⋅
(
n
−
1
)
\displaystyle\frac{1}{2}\cdot (n-1)
21⋅(n−1) (向下取整)个
a
a
a 拿去补剩下的字符。
这样就可以保证
a
a
a、
b
b
b、
c
c
c 都是奇数个,且有关
a
a
a 的子字符串也是奇数个。
代码实现
#include<bits/stdc++.h>//万能头文件
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);//加速
int t;
cin>>t;
while(t--){
int n;
cin>>n;
if(n%2){//如果是奇数
if(n==1) cout<<"a\n";//这里防止出现 bc 而变成三位字符
else{
string s=string(n/2,'a')+"bc"+string(n/2-1,'a');
cout<<s<<"\n";
}
}
else{
string s=string(n/2,'a')+"b"+string(n/2-1,'a');
cout<<s<<"\n";
}
}
return 0;
}//完结撒花
好家伙我写完之后看了其他人的代码参考做题解的时候,发现日本选手 SSRS_ 的代码与我不谋而合
不能说很像吧只能说是一模一样