首页 > 其他分享 >P10058 Reverse and Rotate题解

P10058 Reverse and Rotate题解

时间:2024-01-14 23:14:13浏览次数:26  
标签:opt head Rotate int 题解 P10058 str define size

简单题意

一共 3 个操作:

  • rev:将字符串翻转。
  • > \(x\):将后面 \(x\) 个字母移到前面。
  • < \(x\):将前面 \(x\) 个字母移到后面。

解法

解法一

看到 #1 到 #3 的范围可以打出暴力程序,按题意模拟,时间复杂度 \(O(n|S|)\)。
预计 \(30\) pts。

解法二

很明显,第二个操作和第三个操作有点像一个环,每个点就是字符串上一个字符。一开始头在第一个字符。

进行一次 > 2 后,头就变到了 d 上。

进行一次 < 2 也同理。

重点是 rev 操作,进行一次 rev 操作后,头变到了 c 上。

但此时再进行一次 > 2,却与上次不一样了。

没错,他反过来了,所以这里可以用一个变量表示当前是正着走还是反着走,然后按上面说的方法模拟即可,若有不懂可以看看代码,时间复杂度 \(O(n)\),预计 \(100\) pts。

Code

/*Code By Manipula*/
#include <bits/stdc++.h>
// #define Fileopen
// #pragma GCC optimize(2)
#define INF 0x7f7f7f7f
#define int long long
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define ROF(i, a, b) for (int i = (a); i >= (b); i--)
#define mst(arr, num) memset(arr, num, sizeof(arr))
#define max(x, y)((x) > (y) ? (x) : (y))
#define min(x, y)((x) < (y) ? (x) : (y))
#define swap(x, y) x ^= y ^= x ^= y
#define sqrt(n) pow(n, 0.5)
#define lowbit(x) (x & -x)
#define sort stable_sort
#define endl '\n'
using namespace std;
string str;
int T, head = 0, w = 1;
signed main()
{
	#ifdef Fileopen
		freopen(".in", "r", stdin);
		freopen(".out", "w", stdout);
	#endif
	cin >> str >> T;
	while (T--)
	{
		string opt; int x;
		cin >> opt;
		if (opt == "rev")head = (head + str.size() - w) % str.size(), w = -w;//转换方向,注意是 -w 不是 -1
		else
		{
			cin >> x; x %= str.size();//这里坑点,x 最大为 10^9,|s| 最大为 10^6,如果当前是减掉的话只加上一个|s|还是一个负数,所以先取模
			if (opt == ">")head = (head - w * x + str.size()) % str.size();
			else head = (head + w * x + str.size()) % str.size();
		}
	}
	//输出的时候要加上 w 而不是 1 啊
	for (int i = 0, k = head; i < str.size(); i++, k = (k + w + str.size()) % str.size())
		cout << str[k];
	return 0;
}

标签:opt,head,Rotate,int,题解,P10058,str,define,size
From: https://www.cnblogs.com/Manipula/p/17964407

相关文章

  • P9816 少项式复合幂 题解
    题目链接:少项式复合幂注意到题目的模并不是很大,我们考虑两个核心的性质。\(f(f(x))\bmodp=f(f(x)\bmodp)\bmodp\),证明直接代入\(f(x)\)进去得到:\(f(f(x))=a_0\timesf^0(x)+a_1\timesf^1(x)...+a_n\timesf^n(x)\bmodp=\)\[\sum_{i=0}^{n}a_i\timesf^{i}(x)\b......
  • P5501 [LnOI2019] 来者不拒,去者不追 题解
    题目链接:来者不拒,去者不追直接在线查询题目所给的式子是很困难的,我们考虑单点考察贡献。对于一个已经确定的式子,我们发现加入一个数或者删除一个数的贡献如图所示:如图所示,在原有的序列为\((1,2,3)\)当中,我们加入新的\(2\)进去,我们观察到每个数的贡献的变化是这样,比\(2\)......
  • 题解 P7169 [eJOI2020 Day1] Exam
    传送门。题意有两个长度为\(N\)的数列\(A_i\),\(B_i\)。可以对\(A\)数组进行若干次操作,每次可以使\(A_i\)到\(A_j\)中的所有数变成期间的最大值,求最多能使多少个数满足要求。分析显然,要使我们的某一个\(A_x\)变成\(B_x\),至少会包含\(A_{L_x}\)或\(A_{R_x}\),\(L_......
  • P5321 [BJOI2019] 送别 题解--zhengjun
    由于大家的做法需要大量分类讨论和代码量,这里提供一种不怎么分类的,容易实现的做法。首先,由于墙体会随时变化,所以直接对墙体本身维护不是很方便。我们可以牺牲一点常数,对\((i,j)\)建立四个点\(UL_{i,j},UR_{i,j},DL_{i,j},DR_{i,j}\)分别表示\((i-\varepsilon,j-\varepsilo......
  • AT_arc125_c [ARC125C] LIS to Original Sequence 题解
    题目传送门前置知识贪心|构造解法对于任意一个未加入序列\(P\)的数\(x<A_{i}(1\lei\lek-1)\),如果其放在了\(A_{i}\)的前面,会导致最长上升子序列长度加一,从而不符合题目要求。因此我们需要把\(x\)放在\(A_{i}\)后面,同理,为符合题目要求,我们仅选择放最小的那一个......
  • P2198 杀蚂蚁 题解
    题目大意有一条长度为\(n\)个单位长度的路,蚂蚁们要从起点走到终点。蚂蚁们每走\(1\)个单位距离需要\(T\)秒钟。现在,出题人可以在路上修筑\(3\)种防御塔来阻挡蚂蚁的进攻,每个单位距离只能修筑\(1\)座塔,塔的作用分别如下:激光塔:蚂蚁在塔前时每秒会受到\(r\)点伤害。......
  • P3243 [HNOI2015] 菜肴制作 题解
    前言今天考试考到这道题,挂惨了。题意有\(n\)道菜肴,编号为\(1\simn\)。有\(m\)个条件,形如\((i,j)\),表示菜肴\(i\)必须在菜肴\(j\)之前制作。需求出一个菜肴的制作顺序,满足:在满足所有限制的前提下,\(1\)号菜肴尽量优先制作。在满足所有限制,\(1\)号菜肴尽量优......
  • P9007 [入门赛 #9] 最澄澈的空与海 (Hard Version) 题解
    Updon2023.10.1408:21:修改了推式子和题意的一些小错误。前言一道恐怖的绿题。显然我认为应该是蓝题。(不过在这篇题解写到一半的时候升蓝了,感谢@StudyingFather。)名字挺好的。题意给定\(n\),求出满足以下条件的三元组\((x,y,z)\)的组数:\(x\ge0,z\ge1\)。\(......
  • AT_abc243_g [ABC243G] Sqrt题解
    题目大意有一个数列,初始时只有一个数\(X\)。你可以对它进行一种操作:设末尾的数为\(Y\),从\(1\sim\sqrt{Y}\)中选一个数加到数列的末尾。如此进行\(10^{100}\)次操作,问数列一共有多少种可能的状态。解法考虑DP。设\(dp_i\)表示以数字\(i\)开头的数列可能的状态。设......
  • CF713D 题解
    题意给一个\(01\)矩阵,多次求在给定区间内最大的全\(1\)正方形边长。思路容易想到二分:先预处理出以每个位置为右下角的最大合法正方形的边长\(mx_{i,j}\),然后对于每个询问,我们二分边长\(mid\),设当前询问的区间左上角为\((x_1,y_1)\),右下角为\((x_2,y_2)\),则能取到\(mi......