首页 > 其他分享 >洛谷P10058 题解

洛谷P10058 题解

时间:2024-01-16 12:22:18浏览次数:28  
标签:p2 洛谷 string int 题解 len P10058 取余 op

这种翻转的题明显已经做烂了好吧……

首先显而易见,翻转偶数次对结果没有影响,只需要考虑奇数次翻转的情况。

由于是整体移动的操作,可以抓住一个点来移动,然后还原出原来的序列。

需要注意的是字符串是环形移动,因此如果当前点的位置大于字符串长度,要对字符串的长度进行取余操作。

写的时候注意细节。

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	string a;
	cin>>a;
	int len=a.size();
	int n,f=0,x=1;
	cin>>n;
	while(n--){
		string op;
		cin>>op;
		if(op=="rev") f++,x=len-x+1;//累加rev的次数 
		if(op==">"){
			int s;
			cin>>s;
			s%=len;//取余 
			x+=s;
			x%=len;//取余 
		}
		if(op=="<"){
			int s;
			cin>>s;
			s%=len;//取余 
			x+=len,x-=s;
			x%=len;//取余 
		}
	}
	//还原字符串 
	if(f%2==1){
		string p1=a.substr(x,len-x+1);//使用substr 
		string p2=a.substr(0,x);
		reverse(p1.begin(),p1.end());//奇数次要翻转 
		reverse(p2.begin(),p2.end());
		a=p2+p1;
		cout<<a;
	}
	else{//偶数次没有翻转操作 
		string p1=a.substr(0,len-x+1);
		string p2=a.substr(len-x+1,x);
		a=p2+p1;
		cout<<a;
	}
	return 0;
}

标签:p2,洛谷,string,int,题解,len,P10058,取余,op
From: https://www.cnblogs.com/veryeasy/p/17967401

相关文章

  • Atcoder Beginner Contest 330 题解
    AtCoderBeginnerContest330题解A-CountingPasses签到voidShowball(){intn,l;cin>>n>>l;intcnt=0;for(inti=0;i<n;i++){intx;cin>>x;cnt+=(x>=l);}cout<<cnt<<endl;}B-Minimize......
  • CF1437F Emotional Fishermen 题解
    题意:有\((n\le5000)\)个渔民,每个渔民钓了一条重\(a_i\)的鱼,渔民按任意顺序展示他们的鱼。若当前渔民的鱼的重量为\(x\),之前展示过的鱼的最大重量\(y\)。一个排列满足条件当且仅当对于每个\(x\),满足\(2y\lex\)或\(2x\ley\)。问有多少个排列满足条件,对\(998244353......
  • ABC336 F Rotation Puzzle 题解
    QuestionABC336FRotationPuzzle给出一个\(H\timesW\)的矩阵,里面填有数字,有一种操作选定一个\((x,y)\)交换\((i+x,j+y)\)和\((H-i+x,W-j+y)\)对于每一个\(1\lei\leH-1,1\lej\leW-1\)问,是否能经过\(20\)次以内的操作使得,最后的矩形变成\((i,j)=((i-1)\t......
  • P1002题解
    思路设\(dp_{i,j}\)表示第\(i\)行\(j\)列卒走到这里有多少种方式。卒是可以向右和下走,所以到这个点只能从左或上来,不难得出转移公式:\(dp_{i,j}=dp_{i-1,j}+dp_{i,j-1}\)。如果马在这个点上或者说马能到这个点上,那么卒不能到这个点,也就是卒到这个点的方式为\(0\)。如......
  • P1003题解
    简单模拟题。思路枚举每一个地毯,因为后面的会覆盖前面的,所以从正序枚举。如果要求的点的坐标在当前地毯上,则将答案赋值为当前地毯编号。最后输出答案。那如果这个点没有地毯呢?答案初始设为\(-1\),这样没有地毯覆盖的话,答案不会改变,这样输出答案就会是\(-1\)。注意:记得赋初......
  • P10058题解
    怎么前三题都是思维题啊。思路总共有三个操作,先不看翻转操作。如果你右移\(x\)位之后,左移\(x\)位,那么就相当于没有操作。这个应该是很好理解的。我们根据上面的结论,能得出以下代码。if(op==">"){cin>>x;f+=x;}elseif(op=="<"){......
  • CF1409D题解
    思路因为数据较大,使用字符串读入。考虑使用贪心。先统计出当前数码之和。然后从低位往高位枚举,看一下把当前位改了之后是否小于等于\(s\)。如果小于的话,则统计出把当前位往后所有位都改为0,\(k\)为多少,求出的\(k\)就是最优解。说明一下为什么要从低位往高位枚举,这样如果成......
  • AT_arc060_c题解
    纪念模拟考考挂。思路首先二分查找出当前点往后走最远能去哪个点,当前点为\(i\),记最远能去的那个点为\(nt_i\)。考虑建一棵树,将\(nt_i\)设为\(i\)点的父节点。暴力的话直接从当前点往上找,找到目标节点看几次就好了。但显然是过不了的。考虑使用倍增优化。设\(g_{i,j}......
  • 1.15模拟赛 T2题解
    简要题意多重背包但是乘法思路暴力就直接跑背包考虑乘法能否变为加法,可以找到模数的原根,将每个数映射一下,这样乘法就变成了加法,可以直接\(\text{bitset}\)优化,但是暴力这样做还是过不了于是我们考虑二进制分组优化背包,这样复杂度貌似就对了?code#pragmaGCCoptimize("Ofast......
  • border设置渐变boder-radius不生效问题解决方案
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metahttp-equiv="X-UA-Compatible"content="IE=edge"/><metaname="viewport"c......