题目描述
小沙的构造题没了,他很伤心,所以他想把这个构造送给你们,而你需要的就是彪起你的手速,抓紧抢到这题的一血。
这题小沙想让你构造出一串字符串,这个字符串有以下几个特点。
1,他是对称串,他关于这个字符串的垂直对称。例如"()",我们将他翻转过来他也是“()”,例如“p“翻转过来就是“q“。
2, 这个串串的所有字符都是除小写字母以外的可见字符(不包括空格)。
现在小沙想让你构造一个长度为nnn的不同字符数量为mmm的一个字符串。
可见字符如下:
!"#$%&'()*+,-./0123456789:;<=>?@[\]^_`QWERTYUIOPASDFGHJKLZXCVBNM{}|~
其中具有对称性质的有
"!'*+-.08:=^_WTYUIOAHXVM|<>\/[]{}()
输入描述:
第一行输入两个整数1≤n≤104,1≤m≤36
输出描述:
如果可以构造出这样的一个字符串,便输出这个字符串
否则输出-1
示例1
输入
3 1
输出
OOO
示例2
输入
3 3
输出
<=>
思路:
简单的模拟题把n和m枚举一下就好了,一共就四个情况,每个情况都模拟一下; 一共只有35个不同的字母所以当m==36时一定是输出-1的并且当n<m or (m > 11 && n < (m-10)*2-1+10 ) 也是输出-1; 别的情况都是能构造成功的
#include "bits/stdc++.h"
using namespace std;
int main(){
string s = "\"!'*+-.08:=^_WTYUIOAHXVM|<>\\/[]{}()";
map<char, char> mp,vis;
int n,m;
for (int i = 0; i < 25; i++) {
mp[s[i]] = s[i];
}
for (int i = 25; i < 35; i += 2) {
mp[s[i]] = s[i + 1];
mp[s[i + 1]] = s[i];
}
while(cin>>n>>m) {
int k = m - 10;
k = k * 2 - 1;
k += 10;
int a = n;
int b = m;
string str = "";
if (n < m || m == 36 || (m > 11 && n < k)) cout << -1 << endl;
else {
if (m == 1) {
for (int i = 1; i <= n; i++) {
str += s[0];
}
} else {
if (n & 1) {
if (m & 1) {
for (int i = 25; i < 35; i+=2) {
if (m <= 1) break;
str += s[i];
m -= 2;
}
for (int i = 0; i < 25; i++) {
if (m <= 0) break;
str += s[i];
m--;
}
int len = str.size();
for (int i = len - 2; i >= 0; i--) {
str += mp[str[i]];
}
n -= str.size();
for (int i = 1; i <= n / 2; i++) {
str = str[0] + str;
str += mp[str[0]];
}
} else {
for (int i = 25; i < 35; i+=2) {
if (m <= 2) break;
str += s[i];
m -= 2;
}
for (int i = 0; i < 25; i++) {
if (m <= 0) break;
str += s[i];
m--;
}
int len = str.size();
for (int i = len - 2; i >= 0; i--) {
str += mp[str[i]];
}
n -= str.size();
for (int i = 1; i <= n / 2; i++) {
str = str[0] + str;
str += mp[str[0]];
}
}
}else{
if(m&1){
for(int i=25;i<35;i+=2){
if(m<=1) break;
str+=s[i];
m-=2;
}
for(int i=0;i<25;i++){
if(m==0) break;
str+=s[i];
m--;
}
// cout<<str<<endl;
int len=str.size();
for(int i=len-1;i>=0;i--){
str+=mp[str[i]];
}
n-=str.size();
for(int i=1;i<=n/2;i++){
str=str[0]+str;
str+=mp[str[0]];
}
}else{
for(int i=25;i<35;i+=2){
if(m<=0) break;
str+=s[i];
m-=2;
}
for(int i=0;i<25;i++){
if(m==0) break;
str+=s[i];
m--;
}
int len=str.size();
for(int i=len-1;i>=0;i--){
str+=mp[str[i]];
}
n-=str.size();
for(int i=1;i<=n/2;i++){
str=str[0]+str;
str+=mp[str[0]];
}
}
}
}
cout << str << endl;
}
}
return 0;
}
/*
* 16 12
* 4 3
* <''>
*/