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

题目链接

https://www.luogu.com.cn/problem/P1098

题目思路

模拟,注意记录偏移量来去掉 ''-''

题目代码

最傻的模拟

#include <iostream>
#include <algorithm>

using namespace std;
const int N = 110;
int p1, p2, p3;

int main()
{
    cin >> p1 >> p2 >> p3;
    string s;
    cin >> s;
    int cnt = 0;
    string t = "";
    for(int i = 0; i < s.size(); i ++ )
    {
        t += s[i];
        if(s[i] == '-')
        {
            if((s[i - 1] >= 'a' && s[i - 1] <= 'z') && (s[i + 1] >= 'a' && s[i + 1] <= 'z'))
            {
                if(s[i - 1] < s[i + 1])
                {
                    t.erase(i + cnt);
                    if(p1 == 1)
                    {
                        string tmp = "";
                        int l = s[i - 1] - 'a', r = s[i + 1] - 'a';
                        for(int j = l + 1; j < r; j ++ )
                        {
                            for(int k = 0; k < p2; k ++ )
                            {
                                char c = j + 'a';
                                tmp += c;
                            }
                        }
                        cnt += tmp.size() - 1;
                        if(p3 == 1) t += tmp;
                        else if(p3 == 2) 
                        {
                            reverse(tmp.begin(), tmp.end());
                            t += tmp;
                        }
                    }
                    else if(p1 == 2)
                    {
                        string tmp = "";
                        int l = s[i - 1] - 'a', r = s[i + 1] - 'a';
                        for(int j = l + 1; j < r; j ++ )
                        {
                            for(int k = 0; k < p2; k ++ )
                            {
                                char c = j + 'A';
                                tmp += c;
                            }
                        }
                        cnt += tmp.size() - 1;
                        if(p3 == 1) t += tmp;
                        else if(p3 == 2) 
                        {
                            reverse(tmp.begin(), tmp.end());
                            t += tmp;
                        }
                    }
                    else if(p1 == 3)
                    {
                        string tmp = "";
                        int l = s[i - 1] - 'a', r = s[i + 1] - 'a';
                        for(int j = l + 1; j < r; j ++ )
                        {
                            for(int k = 0; k < p2; k ++ )
                            {
                                char c = '*';
                                tmp += c;
                            }
                        }
                        cnt += tmp.size() - 1;
                        if(p3 == 1) t += tmp;
                        else if(p3 == 2) 
                        {
                            reverse(tmp.begin(), tmp.end());
                            t += tmp;
                        }
                    }
                }
            }
            if((s[i - 1] >= '0' && s[i - 1] <= '9') && (s[i + 1] >= '0' && s[i + 1] <= '9'))
            {
                if(s[i - 1] < s[i + 1])
                {
                    t.erase(i + cnt);
                    if(p1 == 1 || p1 == 2)
                    {
                        string tmp = "";
                        int l = s[i - 1] - '0', r = s[i + 1] - '0';
                        for(int j = l + 1; j < r; j ++ )
                        {
                            for(int k = 0; k < p2; k ++ )
                            {
                                char c = j + '0';
                                tmp += c;
                            }
                        }
                        cnt += tmp.size() - 1;
                        if(p3 == 1) t += tmp;
                        else if(p3 == 2) 
                        {
                            reverse(tmp.begin(), tmp.end());
                            t += tmp;
                        }
                    }
                    else if(p1 == 3)
                    {
                        string tmp = "";
                        int l = s[i - 1] - '0', r = s[i + 1] - '0';
                        for(int j = l + 1; j < r; j ++ )
                        {
                            for(int k = 0; k < p2; k ++ )
                            {
                                char c = '*';
                                tmp += c;
                            }
                        }
                        cnt += tmp.size() - 1;
                        if(p3 == 1) t += tmp;
                        else if(p3 == 2) 
                        {
                            reverse(tmp.begin(), tmp.end());
                            t += tmp;
                        }
                    }
                }
            }
        }
    }
    cout << t << endl;
    return 0;
}

一些省略上面操作的函数

1、s.erase(x,y) 表示将字符串s从x位置起删除y个字符

2、s.insert(x,y) 表示将字符串y(或字符y)插入到s的x位置处

3、s.push_back(x) 表示在s的末尾插入字符x

4reverse(s.begin(),s.end()) 将字符串s翻转
posted @   vacilie  阅读(99)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示
主题色彩