题目描述
小沙的构造题没了,他很伤心,所以他想把这个构造送给你们,而你需要的就是彪起你的手速,抓紧抢到这题的一血。
这题小沙想让你构造出一串字符串,这个字符串有以下几个特点。
1,他是对称串,他关于这个字符串的垂直对称。例如"()",我们将他翻转过来他也是“()”,例如“p“翻转过来就是“q“。
2, 这个串串的所有字符都是除小写字母以外的可见字符(不包括空格)。
现在小沙想让你构造一个长度为nnn的不同字符数量为m的一个字符串。
可见字符如下:
!"#$%&'()*+,-./0123456789:;<=>?@[\]^_`QWERTYUIOPASDFGHJKLZXCVBNM{}|~
其中具有对称性质的有
"!'*+-.08:=^_WTYUIOAHXVM|<>\/[]{}()
输入描述:
第一行输入两个整数1≤n≤104,1≤m≤36。
输出描述:
如果可以构造出这样的一个字符串,便输出这个字符串
否则输出-1
示例1
输入
3 1
输出
OOO
示例2
输入
3 3
输出
<=>
思路:
1,首先满足m这个种类,满足m后考虑n这个长度.
2,字符串可相加.
3,分清奇偶,模拟
4,代码较长,但是清晰
代码:
#include<bits/stdc++.h>
using namespace std;//字符串的构造,字符串的相关
char *s1="\"!'*+-.08:=^_WTYUIOAHXVM|";//25
char *s2="<>\\/[]{}()";//10
const int maxj=1e4+100;
int main(){
int n,m;
scanf("%d%d",&n,&m);
if(m==36)return cout<<-1,0;
if(n&1)//分奇偶
{
string t="";
t=s1[0];
m--;
int q1=1,q2=0;
while(m>=2&&q2<=8){//由下边决定
t=s2[q2]+t+s2[q2+1];
q2+=2;
m-=2;
}
while(m&&q1<=24){
t=s1[q1]+t+s1[q1];//24极限
m--;
q1++;
}
if(!m){
int d=t.size();
if(d>n)cout<<-1;//种类优先
else{
int now=n-d;
while(now){
t=s1[0]+t+s1[0];
now-=2;
}
cout<<t;
}
}
else{
cout<<-1;
}
}else{
if(m==1){
for(int i=0;i<n;++i){
cout<<0;
}
return 0;
}
string t = "";
int q1=0,q2=0;
while(m>=2&&q2<=8){//由下边决定
t=s2[q2]+t+s2[q2+1];
q2+=2;
m-=2;
}
while(m&&q1<=24){
t=s1[q1]+t+s1[q1];//24极限
m--;
q1++;
}
if(!m){
int d=t.size();
if(d>n)cout<<-1;//种类优先
else{
int now=n-d;
while(now){
t=s2[0]+t+s2[1];
now-=2;
}
cout<<t;
}
}
else{
cout<<-1;
}
}
return 0;
}