3 条题解
-
0
当每次遇到操作二时,不进行操作,而是对两个数进行偏移。 过程: 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
- 上传者