首页 > 其他分享 >P10058题解

P10058题解

时间:2024-01-15 22:23:39浏览次数:30  
标签:右移 题解 cin long P10058 fg 翻转 op

怎么前三题都是思维题啊。

思路

总共有三个操作,先不看翻转操作。

如果你右移 \(x\) 位之后,左移 \(x\) 位,那么就相当于没有操作。这个应该是很好理解的。

我们根据上面的结论,能得出以下代码。

    if(op==">"){
        cin>>x;
        f+=x;
    }
    else if(op=="<"){
        cin>>x;
        f-=x;
    }

变量 \(f\) 是最终应该右移多少位,\(op\) 是操作,\(x\) 是位数。

统计出最终右移多少位,最后进行操作。

接着看翻转。

首先,翻转两次是可以抵消的。

思考,翻转前需要右移 \(x\) 位,那么翻转后需要右移多少位呢?

不妨举个例子。

如果字符串 abcde 需要右移 1 位。按正常顺序,先右移,变成 eabcd,再翻转,变成 dcbae。如果先翻转,变成 edcba,发现只需要在左移 1 位,即右移 -1 位,就正好可以变为 dcbae

因此我们的规律是,翻转前需右移 \(x\) 位,翻转后需右移 \(-x\) 位。

仔细在脑子里想一想,画一画,发现这个规律很显然成立,主要是需要想到这一步。

然后这个问题就可以解决了。

如果是左移或右移,就按前面的操作办。如果是翻转,就看记录次数,并且变量 \(f\) 应该乘上 -1,最后如果总共翻转奇数次,则需要给字符串翻转,然后右移即可。

还有一下几点需要注意:

  • 如果一个字符串右移自己的长度位,就相当于没有操作,所以最终需要将 \(f\) 对字符串长度取模。

  • 最后取模的话,一定要开 long long

AC CODE

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
    int T,f=0,x,n,fg=0;
    string s;
    cin>>s;
    n=s.size();
    cin>>T;
    while(T--){
        string op;
        cin>>op;
        if(op==">"){
            cin>>x;
            f+=x;
        }
        else if(op=="<"){
            cin>>x;
            f-=x;
        }
        else{
            f=-1*f;
            fg=(fg==0?1:0);
        }
    }
    f=f%n;
    if(fg)reverse(s.begin(),s.end());
    if(f==0)return cout<<s,0;//这里应该不要这么麻烦
    if(f>0){
        cout<<s.substr(n-f)<<s.substr(0,n-f);
    }
    else{
        f=abs(f);
        cout<<s.substr(f)<<s.substr(0,f);
    }
	return 0;
}

标签:右移,题解,cin,long,P10058,fg,翻转,op
From: https://www.cnblogs.com/xdh2012/p/17966541

相关文章

  • 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......
  • 【题解】gym103743 (2022 JSCPC)
    A.PENTAKILL!考虑直接模拟,规则就是一个人将其他人全部都击杀,并且中间没有重复击杀。code:#include<bits/stdc++.h>usingnamespacestd;map<string,vector<string>>st;intn;stringa,b;intmain(){cin>>n;for(inti=1;i<=n;++i){ci......
  • 题解「JOI 2014 Final」IOI 馒头
    传送门。题意有\(n\)个物品,\(m\)个背包。第\(i\)个物品的价值是\(P_i\),第\(j\)个背包可以装\(C_i\)个物品,但会消耗\(E_i\)的价值。背包不能重复买,问最多可以获得多少价值。分析首先一个简单的贪心,我们在购买背包后塞入物品,一定时从大往小塞,也就是说,我们可以先对......
  • abc336 E - Digit Sum Divisible 题解 数位DP
    题目链接:https://atcoder.jp/contests/abc336/tasks/abc336_e题目大意:我们定义一个整数\(n\)的数位和为\(n\)的十进制表示中的各位上的数字之和。比如:整数\(2024\)的数位和为\(2+0+2+4=8\)。一个正整数\(n\)被称作一个好数如果\(n\)能被它的数位和整除......
  • CF1818B ndivisible 题解
    题意简述构造一个长度为\(n\)的排列\(A\),使得对于任意的\(l,r\)(\(1\lel<r\len\))都满足\(A_l+A_{l+1}+⋯+A_r\)不可以被\(r-l+1\)整除。输出其中一种合法排列即可。解题思路构造题。考虑对\(n\)进行分类讨论:当\(n=1\)时,由样例即可得合法排列为\(1\)......
  • P6021 洪水 题解
    请先完成ddp模板一个ddp讲解视频Part0:题意解释感觉题面太阴间了。所以解释一下:Cxt表示把\(x\)结点的权值改为\(t\).Qx:把\(x\)子树中一些结点删去,使得\(x\)与\(x\)子树内所有叶子结点不连通。求删去的结点权值和的最小值。Part1:先不考虑修改操作发现原......
  • electron安装卡住问题解决
    问题安装electron会卡住,你换镜像,挂梯子都没有用。解决办法自己配置下载electron二进制文件的地址解决步骤npmconfigls进入该配置文件,手动添加ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/electron_mirror=npm.taobao.org这两行重新npminstallele......