2022牛客寒假算法基础集训营2 I题小沙的构造

题目描述

小沙的构造题没了,他很伤心,所以他想把这个构造送给你们,而你需要的就是彪起你的手速,抓紧抢到这题的一血。

这题小沙想让你构造出一串字符串,这个字符串有以下几个特点。

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
 * <''>
 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值