AtCoder - ABC 158 - D(字符串拼接,思维)

3 篇文章 0 订阅
1 篇文章 0 订阅

D - String Formation

题目:

给一个字符串S,进行Q次操作,有翻转字符串、字符串开头加一个字符、字符串结尾加一个字符三种操作,输出最终的字符串。

数据范围:

1 ≤ |S| ≤ 10^{5}

1 ≤ Q ≤ 2 * 10^{5}

思路:

题意很简单,但是因为数据范围给的很大,直接模拟会超时,可以用SIL中的链表list实现快速地插入元素。(字符串拼接一般通过s+=ss;和s=s+ss;实现,用list更快)

反转直接调用reverse会超时(时间复杂度为O(n)),其实反转后向头部插入元素,相当于反转前向尾部插入元素。按照这种方式,只需记录操作前需要反转的次数,根据奇偶性处理。

注意最后输出时,如果反转次数为偶数次,正序输出;奇数次,逆序输出。

Code:

#include<iostream>
#include<algorithm>
#include<list>
using namespace std;

#define int long long

void solve()
{
    list<char>q;                  //定义list
    string s;
    cin >> s;
    int n;
    cin >> n;                     
    q.assign(s.begin(), s.end()); //原字符串复制装进q

    int cnt = 0;                  //记录需要反转的次数
    while (n--)
    {
        int a;
        cin >> a;
        if (a == 1)cnt++;         //a==1表示反转
        else
        {
            int b;
            char c;
            cin >> b >> c;

            if (b == 1)                //b==1表示在头添加
            {
                if (cnt % 2 == 0)      //偶数效果不变
                    q.push_front(c);
                else                   //奇数效果相反
                    q.push_back(c);
            } 
            else                       //b==2表示在尾添加
            {
                if (cnt % 2 == 0)
                    q.push_back(c);
                else
                    q.push_front(c);
            }
        }
    }
    if (cnt % 2 == 0)                      //偶数次反转正序输出
        for (auto it = q.begin(); it != q.end(); it++)
            cout << *it;
    else                                   //奇数次反转逆序输出
    {
        auto it = q.end();
        for (it; it != q.begin(); it--)
        {
            if (it == q.end())continue;
            cout << *it;
        }
        cout << *it;
    }
    puts("");
}

signed main()
{
    int t = 1;
    //cin >> t;

    while (t--)
    {
        solve();
    }

    return 0;
}

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
吐槽:本题注意点:

1.list的一些相关操作,比如有哪些添加方式,如何正序/逆序遍历等等。

2.还有字符串反转的优化,想不明白就多试试样例,锻炼思维就得多思考嗯。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值