D - String Formation
题目:
给一个字符串S,进行Q次操作,有翻转字符串、字符串开头加一个字符、字符串结尾加一个字符三种操作,输出最终的字符串。
数据范围:
1 ≤ |S| ≤
1 ≤ Q ≤ 2 *
思路:
题意很简单,但是因为数据范围给的很大,直接模拟会超时,可以用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.还有字符串反转的优化,想不明白就多试试样例,锻炼思维就得多思考嗯。