CF1554D Diane 题解
很显然,这是一道(智商题)
题目链接放着了哦
晚上实在没空打 CF,第二天早上补题目,看到 D 题的样例输出瞬间懵了,但是感觉不是这样的。
后来想了半天看了 tags,上面写着 greedy (贪心)。我才想到,只用 \(\texttt abc\) 三个字母,搞贪心的话也可以实现。
题目(已翻译)
给你一个整数 \(n\)。找出任何长度为 \(n\) 的字符串 \(s\),只包含英文小写字母,使 \(s\) 的每个非空子字符串以 \(s\) 的奇数次数出现。
如果字符串 \(a\) 是字符串 \(b\) 的子字符串,那么 \(a\) 可以从 \(b\) 中获得,方法是从开头删除几个(可能是零个或全部)字符,从结尾删除几个(可能是零个或全部)字符。
输入
第一行包含一个整数 \(t\)。
接下来 \(t\) 行,每行是一个整数 \(n\)。
输出
对于每个测试用例,打印一行包含字符串 \(s\) 的代码。
如果有多个这样的字符串,输出任何一个。以此可以证明这样的字符串在给定的约束条件下始终存在。
样例输出
4
3
5
9
19
样例输出
abc
diane
bbcaabbba
youarethecutestuwuu
数据约定
\(1\leqslant t\leqslant 500\),\(1\leqslant n\leqslant 10^5\) 。
保证总和 \(n\) 在所有测试用例中不超过 \(3 \cdot 10^5\) 。
总之,这道题的基本想法就是,左边放 \(\displaystyle\frac{1}{2}\cdot n\) (向下取整)个 \(a\)。
如果是偶数个,那中间放个 \(b\),奇数个就放 \(bc\)。
然后再放\(\displaystyle\frac{1}{2}\cdot (n-1)\) (向下取整)个 \(a\) 拿去补剩下的字符。
这样就可以保证 \(a\)、\(b\)、\(c\) 都是奇数个,且有关 \(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_ 的代码与我不谋而合
不能说很像吧只能说是一模一样

浙公网安备 33010602011771号