关于本题最短解
查看原帖
关于本题最短解
715948
small_lemon_qwq楼主2025/6/18 11:29

注意到输出只有 66 中可能字符,考虑将每个字符映射为 0055 的数,这样两个字符就可以合并为一个字符,长度减半,代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
	freopen("1.txt","r",stdin);
	freopen("2.txt","w",stdout);
	char c=getchar(),c2=getchar();
	while(c!=EOF&&c2!=EOF){
		if(c==' ')c=0;
		if(c=='*')c=1;
		if(c=='.')c=2;
		if(c=='#')c=3;
		if(c=='-')c=4;
		if(c=='\n')c=5;
		if(c2==' ')c2=0;
		if(c2=='*')c2=1;
		if(c2=='.')c2=2;
		if(c2=='#')c2=3;
		if(c2=='-')c2=4;
		if(c2=='\n')c2=5;
		cout<<char(36+c*6+c2);//36换成其它6的倍数都行
		c=getchar();
		c2=getchar();
	}
	return 0;
}

输出时在解密即可。

#include<bits/stdc++.h>
char g(int x){if(x==0)return' ';if(x==1)return'*';if(x==2)return'.';if(x==3)return'#';if(x==4)return'-';if(x==5)return'\n';}std::string s="$$$$$$$$++++B$$$$$$$++++++B$$$$$$$99228B$$$$$$839223825$$$$$$'92223996$$$$$$'9$$$$$$9;$$$$$$$$222220$$$$$$$826$$$$'23B$$$$$$$9-999$$$$$$$$'33$$$$$88;$$$$$$99+++-996$$$$$$886$$$$'33B$$$$$23+,++19820$$$$'23$$$$$82;$$$$$&21++++-822$$$$$'9$$$$$$9;$$$$$&21+*$%++22B$$$$$$99$$$$99B$$$$$999$$$$999E999999999999999999999999999999;828223382822338282233:@@@@@@@@?E999999999999999999999@@@@@@@@@;8322823832282383228239999999999E999999999999999999996$'@@@@@;822822382282238228223$$:@@@@?E999999999999999999996$'@@@@@;883228388322838832283$$:@@@@?E999999999999999999996$'999996";main(){for(int c:s){std::cout<<g(c/6-6)<<g(c%6);}return 0;}

但这样还是比不过这个帖子里的 python 代码,我们也要用 python。

注意到 base85 可以处理不可见字符,而 632566^3\le 256,所以可以 33 个字符压成一个,再用 base85,代码不知道能变短多少,没写。

我能写题解吗

2025/6/18 11:29
加载中...