构造题
zibenlun
·
·
题解
看到好多大佬都在写,我也来写一发
根据其他大佬的思路,我们可以想到用以下字符串作为基本串。
ccccccccccccccccccccc……
之后我们要找到一个等价于相同长度连续 c 的字符串,那么首先就可以找到 dD。
过程:
```cpp
for(char i='a';i<='z';i++){
for(char j='A';j<='Z';j++){
if(i*31+j==3168){
cout<<i<<j<<endl;
}
}
for(char j='a';j<='z';j++){
if(i*31+j==3168){
cout<<i<<j<<endl;
}
}
}
for(char i='A';i<='Z';i++){
for(char j='A';j<='Z';j++){
if(i*31+j==3168){
cout<<i<<j<<endl;
}
}
for(char j='a';j<='z';j++){
if(i*31+j==3168){
cout<<i<<j<<endl;
}
}
}
```
之后我们就要想办法构造出每一种的字符串。可以发现总共 $n$ 的值与最长的字符串的值相同,所以我们可以按照 $n$ 的大小构造字符串的长度。然后把所有的字符串每一次选取两个字符修改为 $dD$,在输出。为了防止越界,需要把 ```n==1000``` 时字符串的长度控制在规定长度内,然后剩下的输出一个含有两个 $dD$ 的字符串即可。
# CODE:
```cpp
#include<bits/stdc++.h>
using namespace std;
string c;
int n;
int main(){
cin>>n;
for(int i=0;i<n+1;i++) c+="c";
if(n==1000){
c=c.substr(0,1000);
printf("dDdD");
for(int i=5;i<=1000;i++) putchar('c');
putchar('\n');
}
for(int i=1;i<=999*(n==1000)+n*(n!=1000);i++){
string s=c;
s[i-1]='d';s[i]='D';
cout<<s<<"\n";
}
return 0;
}
```