洛谷题单指南-模拟和高精度-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 << "-";
                
        }
    }
}

 

posted @ 2024-01-19 15:50  五月江城  阅读(40)  评论(0编辑  收藏  举报