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 <bits/stdc++.h>
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;
}
posted @   Pannnn  阅读(134)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
-->
点击右上角即可分享
微信分享提示