返回题解分享
讨论 / 题解分享/ 帖子详情

神秘石板 - 题解

当每次遇到操作二时,不进行操作,而是对两个数进行偏移。
过程:
1.当第一次遇到操作二时,对后续每次的操作一的交换索引进行偏移。如果左索引在前本段,对应于如果进行操作二后位置在后半段,相当于对左索引+n,即还是交换相对应的那个字符;如果在字符右半段,即-n。右索引同理。
2.当遇到第二次操作二时,则原本暴力方法进行第一次的操作二后再执行现在的一次操作二,则变成了现在对索引偏移(不进行真实的操作二)的结果。相当于变回来了,对于后续的操作一,则不需要再进行偏移,因为跟每次都执行操作一的结果统一了。
3.以此类推,遇到奇数次的操作二,后续的操作一跟暴力解法结果,每次都差一个操作二的步骤变换。遇到偶数次的操作二,则后续的操作一结果都一样。

#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
int main()
{
  int len,q;
  cin>>len;
  string s;
  cin>>s;
  cin>>q;
  bool flag = false;
  while(q--)
  {
    int a,m,n;
    cin>>a>>m>>n;
    m--,n--;
    if(a == 1)
    {
      if(flag)
      {
        m = (m < len ? m+len : m-len);
        n = (n < len ? n+len : n-len);
      }
      swap(s[m],s[n]);
    }
    if(a == 2)
     flag = !flag;
  }
  if(flag)
  {
    reverse(s.begin(),s.end());
    reverse(s.begin(),s.begin()+len);
    reverse(s.begin()+len,s.end());
  }
  cout<<s;
}
0 回复 0 转发 0 喜欢 1 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!