Logo zibenlun 的博客

博客

构造题

...
zibenlun
2025-12-01 12:58:16
分块好啊

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2023-09-05 22:55:34

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

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

ccccccccccccccccccccc……

之后我们要找到一个等价于相同长度连续 $c$ 的字符串,那么首先就可以找到 $dD$。

过程: $c$ 的值是 $99$,所以 $cc$ 的贡献是 $99×31+99×1=3168$,而我们可以通过写一个暴力代码求出与他相同的字符串:

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:

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

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。