VJ STL Encoding(解题过程+学到的新知识:结构体作map key,value,构造cmp+嵌套map的一些误区)

question:

Given a string containing only ‘A’ - ‘Z’, we could encode it using the following method:

  1. Each sub-string containing k same characters should be encoded to “kX” where “X” is the only character in this sub-string.

  2. If the length of the sub-string is 1, ‘1’ should be ignored.

Input:
The first line contains an integer N (1 <= N <= 100) which indicates the number of test cases. The next N lines contain N strings. Each string consists of only ‘A’ - ‘Z’ and the length is less than 10000.

Output:
For each test case, output the encoded string in a line.

Sample Input:
2
ABC
ABBCCC

Sample Output:
ABC
A2B3C

本来不是什么难题。但是读题没读对。看着这个题给出的范例我最开始以为需要读入,计数并且排序,两个相关联的数据,很自然的就想到了map容器。

map容器处理关联问题

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n;
    scanf("%d",&n);
    //读入字符?
    //通过map建立key(字母)与value(次数)之间的映射
    //接收输入->find()查找是否有该key->无则insert map/有则更改value
    for(int i=0;i<n;i++){
        map<char,int> m;
        string s;
        cin>>s;
        char ch;
        for(int i=0;i<s.length();i++)
        {
            ch=s[i];
            if(m.find(ch)!=m.end()){//如果已经有了
                m.find(ch)->second++;//那么次数加一//访问方式类似指针
            }
            else{
                m.insert(pair<char,int>(ch,1));//初始插入value为1
            }
        }
        for(auto x:m){
            if(x.second!=1){cout<<x.second<<x.first;}
            else{cout<<x.first;}
        }
    }
    return 0;
}

想法单纯。结果第一次提交错了。崩溃。
然后想到了可能不是需要排序的,但是map又是自动排序的,就很为难。然后查用法,学到了可以用结构体/数组作为map的key或者value,但是key不能随意更改,所以肯定不能用来key来存次数。

所以尝试了用结构体作为map的value。有如下代码:

结构体做map的value

struct val{
    int a;
    int b;
    bool operator < (const val &o) const{
        return b<o.b;
    }
};

int main()
{
    int n;
    scanf("%d",&n);
    //读入字符?
    //通过map建立key(字母)与value(次数)之间的映射
    //接收输入->find()查找是否有该key->无则insert map/有则更改value
    for(int i=0;i<n;i++){
        // vector <char> vec;
        // vector <int> c(100,0);
        map<char,val> m;
        val v;
        string s;
        cin>>s;
        char ch;
        for(int i=0;i<s.length();i++)
        {
            ch =s[i];
            if(m.find(ch)!=m.end()){//如果已经有了
                m.find(ch)->second.a++;//那么次数加一//访问方式类似指针
            }
            else{
                v.b=i;
                v.a=1;
                m.insert(pair<char,val>(ch,v));//初始插入value为1
            }
        }
        for(auto x:vec){
            if(c[x]!=1){cout<<c[x]<<x;}
            else{cout<<x;}
        }
        cout<<endl;
    }
    system("pause");
    return 0;
}

值得注意的是,利用结构体作为map内元素进行赋值的时候,需要建立一个该结构体的变量用以接收值,再将结构体整体用pair/make_pair赋给map。

后来发现也不行。虽然我能储存了这个输入的顺序,但是输出的时候我需要两个循环遍历才能按照我b的大小顺序输出而且还得判断是否是重复的。

至此,心态崩溃60%.

为什么只是60%

因为我在搞结构体作为value的早就想到了更简单的方法:两个数组,用字符作为下标来计数共有多少个A,B···字符。

int main()
{
    int n;
    scanf("%d",&n);
    //读入字符?
    //通过map建立key(字母)与value(次数)之间的映射
    //接收输入->find()查找是否有该key->无则insert map/有则更改value
    for(int i=0;i<n;i++){
        vector <char> vec;
        vector <int> c(100,0);
        // map<char,val> m;
        // val v;
        string s;
        cin>>s;
        char ch;
        for(int i=0;i<s.length();i++)
        {
            ch =s[i];
            if(find(vec.begin(),vec.end(),ch)!=vec.end()){c[ch]++;}
            else{vec.push_back(ch);c[ch]++;}
        }
        for(auto x:vec){
            if(c[x]!=1){cout<<c[x]<<x;}
            else{cout<<x;}
        }
        cout<<endl;
    }
    system("pause");
    return 0;
}

最后依然WA,心态崩溃99%了。

最后反复看题,反复看题,看着A2B3C这个数据,我醍醐灌顶,心中大叫一声马赛卡!!!。然后写出了AC代码如下:

AC代码

#include <iostream>
#include <stdio.h>
#include <cstring>

using namespace std;

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        char temp;
        string s;
        cin>>s;
        char pre=s[0];
        for(int i=1,c=1;i<s.length();i++){
            if(s[i]==pre){
                pre=s[i];
                c++;
                if(i==s.length()-1){
                    cout<<c<<pre;
                }
            }
            else{
                if(c!=1){cout<<c<<pre;c=1;pre=s[i];}
                else{cout<<pre;pre=s[i];}
                if(i==s.length()-1){
                    cout<<pre;
                }
            }
        }
        cout<<endl;
    }
    return 0;
}

最后其实连容器都没用到。简单得我想自戕。

关于嵌套map

在最开始读错题意的时候,想到过用嵌套map,外层map用以根据输入顺序排序
map<int,map<char,int>> m;
第一个int接收输入时i的大小,第二个int自然就是计数了。但是在测试输入为ABC的时候却错误输出了AABABC。其实就是根据第一个int顺序存的其实是当时的内层map,在只读入一个A的时候,内层map为map[‘A’]==1;然后输出就是只输出一个A。至于内层map其实还是在自动排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用Crypto++库中的RSA类来导入RSA公钥/私钥的字符串表示。下面是一个简单的示例代码: ```c++ #include <iostream> #include <string> #include <cryptopp/rsa.h> #include <cryptopp/base64.h> using namespace CryptoPP; int main() { // RSA keys in PEM format std::string publicKeyPEM = "-----BEGIN PUBLIC KEY-----\n" "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvRJ9YmJ9A0seV0bSf+I6\n" "n5i6dF6qXl5Hf8b0KJvJ7eN0yTnE4t5rKQYdM+DLg1yXz+4kWv8xgJxJW9Q2gY7L\n" "wNqROnFJZrOq6zZVrWXfR4gWVv8grl2PZl6vQfGbdzPd2BhLW1QOyPZfGy1CCoMg\n" "FQd6ZqBx1UJHsUSx/PnV0i35S8zO7Zq9UxOYbRr9SiCsTJ0FNLwPz7CkC5u3VJ5D\n" "z5z2K7U0fGkO+8fOc5Qv2JUqKd6sN2oT+18+eVf/lvtlQ4U3aXyKZB7u0k8T3xKx\n" "3J2r3x4y+o9B3fz1aV0R/5N5Iz2Kt6gJyJmJyNfh0T+D5JLZL8o+Oq8rD8/8mLgV\n" "XQIDAQAB\n" "-----END PUBLIC KEY-----\n"; std::string privateKeyPEM = "-----BEGIN PRIVATE KEY-----\n" "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCuN1Qa1iRQ9ZvZ\n" "iFfZjzKfKXk9X5Rq8Dp4CCVt1LJbXG8oU1Kd7UeJb+JyQrK+D1hViDUKvC4pDvZL\n" "7Wv8wzZ1mJN+3M+Vc7dqSaTr0z+U4d3ZKQKj1UjF9/3Ud/HXw6Ez84Zx5fX1U7P\n" "3u9Qo+6g0cva0tYcZ8E4m8osjzOZn3n5Z+qoDZ2IuoktDjQOdT7vZJc7JmLQ+6U\n" "Gyf8B4j0c6V7iJ0oqOeq27m2xY6xu9gKwDvZl9zJrFv6f9JQy6yY5ZjXVItK8o+\n" "x3DfX+eD8XO7Z0f1wO3J5lXgBuJop4B3PzZPmZw3jwN3LZwU7hAqjWQvLj5r+DqR\n" "KwvS6TJnAgMBAAECggEBAJv9zZ1N9sN7E+gTt9y/7xFG2PjgB9VjYWg6bd4QKpRq\n" "zGJNj2n8q6k8l7k2uT6sRcO5RhS8bQpO4iLl3GJXZr5kjC0Z/1kE1p4H8Y9e5bDh\n" "gNl3ZnK3Wpli8q7KqUjOY8j6Ktj7+vZnT3sW6v/qpIbQgBn7d3q0qsqzjTm8c5f\n" "V3JzUJqkVJqX1mJmJd6tZslpO8mJyZL/vkC4KszkQeE8xKu6sIiA4r6l5e0+OJ8M\n" "8XmXhV8D8ZcHgKvq7qrBvFq5Xv2mHsLdQO+J7uNLC3iQzY3u4jB6Gk8fN7N3e3jv\n" "dDmf8P0l7dOj6q5sZtqoK6fJjW+PcVnC8KzXUy4YrtkCgYEA3g9W5c7J8KmX3xSU\n" "2p/7VfGzBYC7J1Ll1fz4qWf3XZ2VQF7q6yRrA5X+H2GkZiB3vL8/3gOeO3WuGnI0\n" "bJr1lOY9xMvQj7a6KdC5h4Wvmt3qqh6VdQw7dFx8fJ8x5RQwReOuyZ9nEE5Vf+en\n" "cRg9Uk9LQl3rZ4cazH7c+Lkrj2ECgYEAzL4u8eJ5gCpUvJZJyCmlrJX0GryL1wzE\n" "5zO8m1tjwg1YONyJvR4g4bd7p+56q6v3wTzoumH6x3AWDZC8Z6Jr6i4a8+cnl+9M\n" "P+Jr5Lr2fN2Y7w3dFzHhY5NIR0ZxTQJdC5Jp+el1+Kg2y4eFJZpQz0ueH2Jy6wuz\n" "zqJUQY2RmXUCgYEAwYjQg1FnKPGvJlRrXwL9cO4I3W0gx/kD+LpT8aEguJlRf4uS\n" "ZyN8a+xLZbGzWc5wKT9z3whYf4fXf4aFh2U+ZQzXG7yUa5KdNf7xvP8QXa6omQY0\n" "sQO2e1+Vc1r7h2e0HNY0U6E0g+7l7MBZv5lZP6XG7HdY5k8n1UdbvR9uGkECgYEA\n" "xAIlWc+0qLQUjY7t2sqHjzJ3nV2GxMvW0G9fZgD6loQWtKX2Y7r/x6WLZ9Smc5ZQ\n" "4QJ1l0sT1q2YKqCwR1u+2J9lX8Pp17FZK8Xvq8kPT9lQK9o3+JvUqPvX6xrmJ2mK\n" "R7uxvYv+ZzL2R9gkt/6g1QH0aRZzZj0+6+J5PfWen9sCgYEA7fQxJYJdQdUgJvZL\n" "gH2Y1o5LJ5W1N3v9zQJLJGJ1Tt7TfB3gXzOzL/hsW68Uzr+1JqP6e9LTk5OuWVQG\n" "yR7zFv3p6K5tqT2Z0OJdS4xVw/2zB5YzJiK6I6b5aMZr9o2ZtW/0A1m5RcU6bJSo\n" "Vz5Q5O1ZoD7JdS3d+6iNq+f8dQ==\n" "-----END PRIVATE KEY-----\n"; // Base64 decode the PEM strings std::string publicKeyStr, privateKeyStr; StringSource(publicKeyPEM, true, new Base64Decoder(new StringSink(publicKeyStr))); StringSource(privateKeyPEM, true, new Base64Decoder(new StringSink(privateKeyStr))); // Load the keys from the decoded strings RSA::PublicKey publicKey; RSA::PrivateKey privateKey; StringSource(publicKeyStr, true, new PEMDecoder(new StringSink(publicKey))); StringSource(privateKeyStr, true, new PEMDecoder(new StringSink(privateKey))); return 0; } ``` 在这个示例中,我们将PEM格式的RSA公钥/私钥字符串进行Base64解码,然后使用Crypto++库中的PEMDecoder类将它们加载到RSA::PublicKey和RSA::PrivateKey对象中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值