Loading

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

4、reverse(s.begin(),s.end()) 将字符串s翻转
posted @ 2022-03-14 17:50  vacilie  阅读(106)  评论(0)    收藏  举报