构造题

· · 题解

看到好多大佬都在写,我也来写一发

根据其他大佬的思路,我们可以想到用以下字符串作为基本串。

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; } ```