洛谷题单指南-模拟和高精度-P1098 [NOIP2007 提高组] 字符串的展开
原题链接:https://www.luogu.com.cn/problem/P1098
题意解读:
题目本身是一道模拟题,但是细节点较多,要拿100分,有以下注意点:
1、-号两个需要同时为小写字母或者数字,才进行填充
2、-号左边>=右边,直接输出-
3、对待填充的内容的处理,可以先看是否填充*;小写字母和数字的填充都是前一位ascii加1,而大写字母填充还要减去32
4、逆序的处理,可以将待填充的内容累加到字符串string,然后用reverse()函数对string进行逆序
100分代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int p1, p2, p3;
cin >> p1 >> p2 >> p3;
string line;
cin >> line;
for(int i = 0; i < line.size(); i++)
{
if(line[i] != '-') cout << line[i];
else
{
char start = line[i - 1]; //取-左边
char end = line[i + 1]; //取-右边
if(start >= 'a' && start <= 'z' && end >= 'a' && end <= 'z' ||
start >= '0' && start <= '9' && end >= '0' && end <= '9') //-两边同为字母或者数字时
{
if(start >= end) cout << "-"; //左边>=右边,直接输出-
else
{
string fill = ""; // 待填充的字符串内容
for(int j = start + 1; j < end; j++) //填充范围
{
for(int k = 1; k <= p2; k++) //填充次数
{
if(p1 == 3) fill += "*"; //如果p1=3填充*
else
{
int t = j; //要填充的内容
if(start >= 'a' && start <= 'z' && p1 == 2) t -= 32; //填充大写字母
fill += t; //p1是1、2填充相应的内容
}
}
}
if(p3 == 2) reverse(fill.begin(), fill.end()); //逆序
cout << fill;
}
}
else cout << "-";
}
}
}