本题的重点在于如何实现三个规则的处理。首先对于规则1和规则2,可以利用一个从0至25的for循环依次判断字符串中是否存在字符A-Z,依次实现了字母从A到Z的排序;同时由于遍历字符串的时候是从前往后,自然实现了按照输入顺序排序。最后对于规则三,由于事先已经将排好序的字母存放起来了,对于源字符串来说,直接将字母位替换为排好序的字母即可,其他位置的字符不变。

#include <string>
#include <iostream>
#include <vector>
using namespace std;

int main() {
    string s;
    getline(cin, s, '\n');
    vector<char> vec;
    // 解决规则1和规则2
    for (int i = 0; i < 26; i++) {
        // i从A开始遍历,相当于实现了从A到Z的遍历
        for (int j = 0; j < s.size(); j++) {
            // 从头开始取字符串,相当于实现了按输入顺序排序
            if (s[j] - 'a' == i || s[j] - 'A' == i) {
                // 依次寻找字符串中是否有26个字母
                vec.push_back(s[j]);
            }
        }
    }
    int k = 0;
    for (int j = 0; j < s.size(); j++) {
        if ((s[j] >= 'a' && s[j] <= 'z') || (s[j] >= 'A' && s[j] <= 'Z')) {
            s[j] = vec[k++];
        }
    }
    cout << s << endl;
    return 0;
}