Problem: P1098 [NOIP2007 提高组] 字符串的展开


// Problem: P1098 [NOIP2007 提高组] 字符串的展开
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1098
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// User: Pannnn

#include 

using namespace std;

void extend(string &res, char end, int p1, int p2, int p3) {
    // -的前一个字符
    char start = res.back();
    /*
        如果不满足展开条件,添加-
    */
    if (!(islower(start) && islower(end) && end > start)
        && !(isdigit(start) && isdigit(end) && end > start)) {
            res += "-";
            return;
    }
    
    // 开辟临时结果,便于翻转,由于展开不包括首尾,循环范围即[start + 1, end - 1]
    string tRes;
    for (char c = start + 1; c < end; ++c) {
        // 要插入的字符,初始化为c
        char insert = c;
        if (p1 == 2 && isalpha(c)) {
            insert = toupper(c);
        } else if (p1 == 3) {
            insert = '*';
        }
        for (int i = 0; i < p2; ++i) {
            tRes += insert;
        }
    }
    if (p3 == 2) {
        reverse(tRes.begin(), tRes.end());
    }
    res += tRes;
}

int main() {
    int p1, p2, p3;
    cin >> p1 >> p2 >> p3;
    
    string src;
    cin >> src;
    
    string res;
    for (int i = 0; i < src.size(); ++i) {
        // 如果是第一个字符或者不是-或者是最后一个字符,不可能发生展开,直接添加
        if (res.empty() ||  src[i] != '-' || i == src.size() - 1) {
            res += src[i];
            continue;
        }
        // 试图展开
        extend(res, src[i + 1], p1, p2, p3);
    }
    
    cout << res << endl;
    return 0;
}

相关