小沙的构造题没了,他很伤心,所以他想把这个构造送给你们,而你需要的就是彪起你的手速,抓紧抢到这题的一血。
这题小沙想让你构造出一串字符串,这个字符串有以下几个特点。
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,代码较长,但是清晰
代码:#includeusing 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< =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<



