3 条题解

  • 0
    @ 2025-3-31 16:36:40

    当每次遇到操作二时,不进行操作,而是对两个数进行偏移。 过程: 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;
    }
    

    信息

    ID
    295
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    68
    已通过
    21
    上传者